Eloquent ORM -关联关系
一对一
比如一个用户只能拥有一个手机号码
//laravel的机制
Phone 模型默认有一个 user_id 外键
User 模型默认有一个 phone_id 外键
//在User模型下定义一个phone方法
class User extends Model{
public function phone()
{
return $this->hasOne('App\Phone');
//也可以自定义外键值
//return $this->hasOne('App\Phone', 'foreign_key');
}
}
//建立关联属性
//这里find的方法会是通过主键查询
$phone = User::find(1)->phone;
//在Phone模型下定义一个 user方法
class Phone extends Model{
public function user()
{
//电话号码属于用户
return $this->belongsTo('App\User');
//同样的也可以自定义外键值
//return $this->belongsTo('App\User', 'foreign_key');
}
}
一对多
比如一篇文章拥有多个评论
//同样的套路,Post下拥有一个comments方法
//注意这里的comments是复数的形式,因为一对多
class Post extends Model{
public function comments()
{
return $this->hasMany('App\Comment');
}
}
//建立关联属性
$comments = Post::find(1)->comments;
//在Comment 模型下定义一个 post方法
class Comment extends Model{
public function post()
{
//评论属于哪一篇文章
return $this->belongsTo('App\Post');
}
}
多对多
比如一个用户拥有多个权限,一个权限可以被很多用户拥有。
这样需要第三方的连接表,users、roles 和 role_user,role_user 表按照关联模型名的字母顺序命名,并且包含 user_id 和 role_id 两个列。
//同样的套路,User下拥有一个roles方法
//注意这里的roles是复数的形式,因为多对多
class User extends Model{
public function roles()
{
//多对多
return $this->belongsToMany('App\Role')->withPivot('其他字段')->withTimestamps();
}
}
//同样的套路,Role下拥有一个users方法
//注意这里的roles是复数的形式,因为多对多
class Role extends Model{
public function users()
{
//多对多
return $this->belongsToMany('App\User')->withPivot('其他字段')->withTimestamps();
}
}
//和其他不一样的是多对多拥有第三个中间表
第三张表结构
$table->increments('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('role_id');
时间戳字段需要,withTimestamps
$table->timestamps(); // 时间戳
其他字段,这里需要自己定义withPivot
//外键定义
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('rold_id')->references('id')->on('roles');