模型关联
Eloquent关联在模型中以方法的形式呈现,提供了强大的链式调用和查询功能。可以分为一对一、一对多、多对多、远程一对多、多态一对一、多态一对多、多态多对多、自定义几种。
一对一
用户 User 和手机 Phone 是关联模型,用户拥有手机,手机属于用户。
关联
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
//获取用户关联的手机
public function phone()
{
return $this->hasOne('App\Phone');
}
}
一旦定义了关联,就可以使用Eloquent的动态属性获取相关的记录,如下:
$phone = User::find(1)->phone;
Eloquent会基于模型决定外键名称,会自动假设 Phone 模型有一个 user_id 字段,如果想要覆盖这个决定,可以传递 hasOne 第二个参数,如下:
return $this->hasOne('App\Phone', 'foreign_key');
如果Eloquent外键值与父级id不匹配,可以传递 hasOne 第三个参数,如下:
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
反向关联
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Phone extends Model
{
//获得拥有此手机的用户
public function user()
{
return $this->belongsTo('App\User');
}
}
一对多
文章 Post 和评论 Comment 是关联模型,对一篇文章可以发表很多评论。
关联
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
//获取文章的评论
public function comments()
{
return $this->hasMany('App\Comment');
}
}
访问 Post 文章的 comments 的属性获取评论的集合,如下:
$comments = App\Comment::find(1)->comments();
foreach ( $comments as $comment) {
//
}
还可以添加过滤,如下:
$comments = App\Comment::find(1)->comments()->where('title', 'xxx')->first();
反向关联
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
//获取评论所属文章
public function post()
{
return $this->belongsTo('App\Post');
}
}
定义好之后,可以通过 Comment 模型的 post 动态属性来访问,如下:
$comment = App\Comment::find(1);
echo $comment->post->title;
多对多
用户 User ,角色 Role (中间模型为 UserRole )模型可以认为是多对多关联,用户可以有多个角色,每个角色可以为多个用户所有。对应的数据分别为 users ,roles ,role_user 。其中 role_user 是按两个模型字母排序,包含 user_id 和 role_id 两个字段。
关联
<