Laravel 8 模型结构
多对多关联通过调用 belongsToMany
这个内部方法返回的结果来定义,例如,我们在 User
模型中定义 roles
方法:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 用户拥有的角色
*/
public function roles()
{
return $this->belongsToMany('App\Models\Role');
}
}
一旦关联关系被定义后,你可以通过 roles
「动态属性」获取用户角色:
$user = App\Models\User::find(1);
foreach ($user->roles as $role) {
//
}
当然,像其它所有关联模型一样,你可以使用 roles
方法,利用链式调用对查询语句添加约束条件:
$roles = App\Models\User::find(1)->roles()->orderBy('name')->get();
正如前面所提到的,为了确定关联连接表的表名,Eloquent 会按照字母顺序连接两个关联模型的名字。当然,你也可以不使用这种约定,传递第二个参数到 belongsToMany 方法即可:
return $this->belongsToMany('App\Models\Role', 'role_user');
除了自定义连接表的表名,你还可以通过传递额外的参数到 belongsToMany
方法来定义该表中字段的键名。第三个参数是定义此关联的模型在连接表里的外键名,第四个参数是另一个模型在连接表里的外键名:
return $this->belongsToMany('App\Models\Role', 'role_user', 'user_id', 'role_id');