上次好像忘了写模型关联的方法,这里补充一下
hasOne
user表的id关联order表的user_id,一对一
class User{
public function order()
{
return $this->hasOne(Order::class, 'user_id', 'id');
}
}
order表的user_id关联user表的id,一对一,$class 可以作为参数,当user子类model关联order子类model的时候,可以灵活重写
public function order($class = Order::class)
{
return $this->hasOne($class, 'user_id', 'id');
}
当你需要关联最后一条记录时
public function order($class = Order::class)
{
return $this->hasOne($class, 'user_id', 'id')->orderBy('id', 'desc');
}
where之类的条件拼接也是可行的
public function order($class = Order::class)
{
return $this->hasOne($class, 'user_id', 'id')->where('status', Order::STATUS_CREATE);
}
belongsTo
order表的user_id关联user表的id,一对一
class User{
public function user($class = User::class)
{
return $this->belongsTo($class, 'user_id', 'id');
}
}
这里有人可能会问,这belongsTo和hasOne有啥区别
hasOne(hasMany)使用在:外键在子关联对象中,如业务上user表在order表之上,在User模型使用hasOne关联order,如下
class User{
public function order($class = Order::class)
{
return $this->hasOne($class, 'user_id', 'id');
}
}
belongsTo(belongsToMany)使用在:外键在父联对象中,如业务上order表在user表之下,在Order模型使用belongsTo关联user,如下
class Order{
public function user($class = User::class)
{
return $this->belongsTo($class, 'user_id', 'id');
}
}
hasMany
user表的id关联order表的user_id,一对多
class User{
public function orders($class = Order::class)
{
return $this->hasMany($class, 'user_id', 'id');
}
}
belongsToMany
管理员表admin,角色表role,中间表为admin_has_roles,admin表可以通过中间表查出对应的角色集合
class Admin{
public function roles()
{
return $this->belongsToMany(
\Common\Models\Rbac\Role::class,
'admin_has_roles',
'admin_id',
'role_id'
);
}
}
我们可以看出,这里的使用也印证了hasMany与belongsToMany的区别,belongsToMany是向上查询的,必有一张admin_has_roles的中间表进行关联
这样描述可能有点抽象,我们可以假设上面的user和order的例子,
当一个order指向多个user时(比如多人拼单,只是假设),我们不可能在user表加order_id,所以下级业务表order在关联上级业务表user时,必会有order_has_users之类的中间表,也会用到belongsToMany关联,而不是hasMany了(暂时没有更通俗的表述,有好的建议可以评论补充一下)
网友评论