付费课程, 订阅后即可观看
使用自定义关联字段绑定一对多关系
在我们新开发项目的时候,我们的关联字段名称定义的可能跟Laravel默认的关联字段有不同的命名规则,此时我们的hasMany()和BelongsTo()绑定函数在绑定对象之间一对多关系的时候,就需要指定额外的参数,不然的话,我们的对象关系绑定就会失败;或者说我们进行旧系统改造的时候也会遇到这样的问题,老系统里面数据库中字段的命名方式可能会比较奇葩,我们不得不使用它的命名规则进行系统开发,因为某一段时间内,新老系统可能处在同时运行的状态.
微信扫码登录
![](https://www.coding10.com/images/auth/default.png)
😒《使用自定义关联字段绑定一对多关系》 练习了好几次,每次都卡在这里,http://laravel.test/user/1 获取不到用户,http://laravel.test/post/1获取不到文章数据。数据库里有用户和文章的数据。在 tinker 里创建的 20 篇文章,在 tinker 能获取到用户和文章的信息。(不管项目是跟着这个系列做下来的,还是全新的项目,我都试过了,死活过不了这关。) 已生成用户系统。已在用户模型和文章模型绑定关系: class Post extends Model { protected $fillable = ['title','uid']; public function user() { return $this->belongsTo(User::class,'uid'); } } 用户模型: public function posts() { return $this->hasMany(Post::class,'uid'); } 文章表: public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->unsignedBigInteger('uid'); $table->foreign('uid')->references('id')->on('users'); $table->timestamps(); }); } 文章数据工厂: use App\Post; use Faker\Generator as Faker;
$factory->define(Post::class, function (Faker $faker) { return [ 'title' => $faker->sentence, 'uid' => \App\User::all()->random()->id ]; });
路由文件 web.php : <?php
use App\User; use Illuminate\Http\Request;
Route::get('/', function () { return view('welcome'); });
Route::get('/faker', function () { User::create([ 'name' => 'cat', 'email' => 'cat@qq.com', 'password' => bcrypt('bing8888') ]); User::create([ 'name' => 'dog', 'email' => 'dog@qq.com', 'password' => bcrypt('bing8888') ]); });
Route::get('/bind', function (Request $request) { $user = $request->user();
$user->posts()->create([ 'title' => 'hello' ]);
$user->posts()->createMany([ ['title' => 'hello'], ['title' => 'hello.com'] ]);
$user->posts()->save( new\App\Post(['title' => 'www.bing.com']));
$user->posts()->saveMany([ new\App\Post(['title' => 'www.bing.com-1']), new\App\Post(['title' => 'www.bing.com-2']), new\App\Post(['title' => 'www.bing.com-3']) ]); dd($user->posts); });
Auth::routes(); Route::get('/home', 'HomeController@index')->name('home');
条件具全?我真的不知道是哪里出了问题。没登录用户,和已登录用户状态我都试过, 访问 http://laravel.test/user/1 输出: 404 | 页面不存在 访问 http://laravel.test/post/1 输出: 404 | 页面不存在
后来我把所有的 uid 改回 user_id ,刷新数据库再重新生成数据,访问上面的两个地址,输出同样的信息。 再后来,我在两模型文件上绑定了第三个参数 ‘id' ,还是访问不到。 我到底哪里写错了呢?
条件不全,web.php 中并没有 user 和 post 相关的路由,添加两个可变参数的动态 get 路由就行了
我反复看好几次视频,你也没有 user 和 post 相关的路由?怎么能访问到?
Route::get('/user', function ( Request $request) {
$user = $request->user();
dd($user);
});
你说的路由我没学会写,查看笔记也写不出,应该怎么写?
http://www.coding10.com/lesson/laravel55-routes-params 这是基础部分的课程,静下心来好好学吧,多思考,多推理,有了困难别轻易放过去,写个动态路由是最最基础的内容,传入id之后,就可以查找数据了 $user = User::find($id) 就可以获取到,post也是如此
个人理解能力欠佳,全力以赴也难见长进,唯有边学边悟吧。 Route::get('post/{uid}', function ($uid) { $post = Post::find($uid); return '<div>作者:' . $post->user->name . '</div></br>' . $post->title . '</br>' . $post->created_at; });
Route::get('user/{id}', function ($id) { $user = User::find($id); return $user->name . '</br>'. $user->posts. $user->post->title; # 获取失败 });
学技术只要愿意静下心来,不求快,不冒进,不胡思乱想,坚持一段时间就能突破,用户跟文章是一对多的关系,
$user->post->title; 这样肯定会失败的,因为不是一对一的关系。
对于一对多,可以循环遍历输出每一个文章的内容,http://www.coding10.com/lesson/laravel55-basic-blog-index-page-paginate
这期视频对这部分有很详细的解释,多做多思考视频根据需要看,而不能走马观花什么都看,视频能少看尽量少看,文档能多看尽量多看。
原本我就是看不太懂文档和书本教程,才看视频教程辅助和加强理解的。
文档有英文版,中文版,速查表版。要是再有一套全面加深入完整讲解文档的视频版,或书本版就好了。
那样,看不懂文档的人,可以先查看视频讲解版,或书本讲解版。
我可能学 Laravel 基础太久了,本能对基础课程有了抗拒。
算了,不说了,我要强迫自己再重头开始认认真真的学习基础了。
不,我的观点是你还没真正学过基础,你只是走马观花留了一遍而已,学基础也不是一个好说法,不管哪个行业入门阶段都是“打基础”,基础的东西虽然看似简单,但却最难的阶段,不然也不会说万事开头难,打好了基础,后边反而有一个阶段能做到策马奔腾,然后就会再遇到一个啃骨头阶段,然后又开始循环...... 技术这条路不要抗拒,看到困难得想办法兴奋起来才行,这才是超过别人最好的机会,你得花一些精力克服自己的心理障碍了。
😢😢😢 我还是头一回看到有人在路由文件里获取和创建那么多数据的。现在看来那几本书白学了几个月了。好吧,我学基础去了。