我有一个包含多个列的 UserTable livewire 组件,但是我现在需要添加分配给表中列出的用户的角色。这些角色由 spatie 插件处理。
对于枢轴,我有 model_has_roles 这不是雄辩的,我希望从角色表中获取名称值。
所以关系: model_has_roles.model_id => users.id roles.is =>model_has_roles.role_id
我在 chatGPT 上花了大约一个小时,结果惨败。
首先我如何添加多对多关系以使用用户 ID 获取角色名称,然后我如何将其引用为我在 rappasoft 中的列定义?
Column::make('Role', 'roleName.name')
->sortable()
->searchable(),
目前我在用户中有这个失败
public function role()
{
$roleId = DB::table('model_has_roles')
->select('role_id')
->where('model_type', '=', 'App\Models\User')
->where('model_id', '=', $this->id)
->first()->role_id;
$roleName = DB::table('roles')
->select('name')
->where('id', '=', $roleId)
->first()->name;
return $roleName;
}
public function getRoleNameAttribute()
{
return $this->role();
}
最后一个错误是
Call to undefined relationship [roleName] on model [App\Models\User].
首先,您创建一个 ModelHasRole 模型:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ModelHasRole extends Model
{}
在用户模型中,您定义角色关系:
public function role()
{
$relation = $this->hasOneThrough(
config('permission.models.role'),
ModelHasRole::class,
'model_id',
'id',
'id',
'role_id'
);
return $relation;
}
然后在 rappasoft 中定义您的列
Column::make('Role', 'role.name')
->sortable()
->searchable(),
如果 rappasoft/laravel-livewire-tables 不支持 hasOneThrough,试试这个方法:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ModelHasRole extends Model
{
public function role()
{
return $this->belongsTo(config('permission.models.role'));
}
}
在用户模型中:
public function modelHasRole()
{
return $this->morphOne('App\Models\ModelHasRole', 'model');
}
然后在 rappasoft 中定义您的列
Column::make('Role', 'modelHasRole.role.name')
->sortable()
->searchable(),