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"
}
>>>
以上所述就是本文的全部内容了,希望大家能够喜欢。