Laravel 5框架学习之Eloquent 关系
一个用户可能有多个文章,一个文章是某个用户书写的,这就是关系。同样文章中可能包含多个TAG,而一个TAG可能关联多个文章。
在项目中,我们已经有了User.php,也就是用户模型,查看一下,相当简单。我们希望直接使用$user->articles()的形式获取全部文章,让我们修改user模型:
publicfunctionarticles(){ return$this->hasMany('App\Article'); }
但是我们仅仅完成了关系中的一端,让我们来处理另一端。我们希望的形式是$article->user(),让我们修改article模型。
publicfunctionuser(){ return$this->belongsTo('App\User'); }
在我们的数据库中,文章模型没有用户的外键,我们需要设置,修改create_article_table.php
Schema::create('articles',function(Blueprint$table) { $table->increments('id'); //指定外键列 $table->integer('user_id')->unsigned(); $table->string('title'); $table->text('body'); $table->timestamp('published_at'); $table->timestamps(); //生成外键 $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); });
因为我们只是在开发阶段,还没有上线运行,我们可以直接修改数据库迁移文件,回滚然后迁移即可,但是如果上线运行的话,应该新建一个迁移。
phpartisanmigrate:refresh #输出信息 Rolledback:2015_03_28_050138_create_article_table Rolledback:2014_10_12_100000_create_password_resets_table Rolledback:2014_10_12_000000_create_users_table Nothingtorollback. Migrated:2014_10_12_000000_create_users_table Migrated:2014_10_12_100000_create_password_resets_table Migrated:2015_03_28_050138_create_article_table Migrated:2015_03_28_051200_add_excerpt_to_articels_table
现在让我们使用tinker来创建一个用户。
phpartisantinker PsyShellv0.4.1(PHP5.4.16—cli)byJustinHileman #下面是执行过程 >>>$user=newApp\User; =><App\User#000000007f1ad61a000000006497cc4f>{} >>>$user->name='zhangjinglin'; =>"zhangjinglin" >>>$user->email='zjl@example.com'; =>"zjl@example.com" >>>$user->password=bcrypt('pass'); =>"$2y$10$Nbl2b9wqd.rXqKEsd3pRSOoIyFAFIhbqf71BufwDfS3Guv21SlEx2" >>>$user->save(); =>true >>>App\User::first()->toArray(); =>[ "id"=>"1", "name"=>"zhangjinglin", "email"=>"zjl@example.com", "created_at"=>"2015-03-3103:24:55", "updated_at"=>"2015-03-3103:24:55" ] >>>
现在我们需要新发布的文章和用户关联,我们暂时先修改form_partial.blade.php来隐藏一个用户id,只是暂时:
{{--临时处理--}} {!!Form::hidden('user_id',1)!!}
同时要修改模型的$fillabel属性,以便我们的MassAssisment。
protected$fillable=[ 'title', 'body', 'published_at', 'user_id'//临时设置 ];
OK,添加一个文章。我们使用tinker来查看一下。
phpartisantinker PsyShellv0.4.1(PHP5.4.16—cli)byJustinHileman >>>App\Article::first()->toArray(); =>[ "id"=>"1", "user_id"=>"1", "title"=>"User1Article", "body"=>"User1Body", "published_at"=>"2015-03-3108:00:00", "created_at"=>"2015-03-3104:17:58", "updated_at"=>"2015-03-3104:17:58", "excerpt"=>null ] #获取用户 >>>$user=App\User::first(); =><App\User#0000000051cbb9d70000000073e11a3e>{ id:"1", name:"zhangjinglin", email:"zjl@example.com", created_at:"2015-03-3103:24:55", updated_at:"2015-03-3103:24:55" } #获取用户文章 >>>$user->articles()->toArray(); BadMethodCallExceptionwithmessage'CalltoundefinedmethodIlluminate\Database\Query\Builder::toArray()' >>>$user->articles->toArray(); =>[ [ "id"=>"1", "user_id"=>"1", "title"=>"User1Article", "body"=>"User1Body", "published_at"=>"2015-03-3108:00:00", "created_at"=>"2015-03-3104:17:58", "updated_at"=>"2015-03-3104:17:58", "excerpt"=>null ] ] #为什么使用$user->articles而不是#user->articles()? #事实上,$user->articles()返回的是关系,如果你想用articles()你需要这样用 >>>$user->articles()->get()->toArray(); =>[ [ "id"=>"1", "user_id"=>"1", "title"=>"User1Article", "body"=>"User1Body", "published_at"=>"2015-03-3108:00:00", "created_at"=>"2015-03-3104:17:58", "updated_at"=>"2015-03-3104:17:58", "excerpt"=>null ] ] #你只能使用articles()来进行下一步的工作,比如下面的查询 $user->articles()->where('title','User1Article')->get(); #我们也可以通过article获取user >>>$article=App\Article::first(); =><App\Article#0000000051cbb9d60000000073e11a3e>{ id:"1", user_id:"1", title:"User1Article", body:"User1Body", published_at:"2015-03-3108:00:00", created_at:"2015-03-3104:17:58", updated_at:"2015-03-3104:17:58", excerpt:null } >>>$article->user; =><App\User#0000000051cbb92d0000000073e11a3e>{ id:"1", name:"zhangjinglin", email:"zjl@example.com", created_at:"2015-03-3103:24:55", updated_at:"2015-03-3103:24:55" } >>>
以上所述就是本文的全部内容了,希望大家能够喜欢。