在 rappasoft/laravel-livewire-tables 中使用数据透视表并使用 spatie/laravel-permission

问题描述 投票:0回答:1

我有一个包含多个列的 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].

laravel pivot-table
1个回答
0
投票

首先,您创建一个 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(),
© www.soinside.com 2019 - 2024. All rights reserved.