Laravel定义自定义中间表模型

时间:2017-02-12 15:35:35

标签: php laravel laravel-5 eloquent laravel-eloquent

我试图通过使用Eloquent获取用户权限

我有3张桌子,

第一个是用户表,

第二个是权限

,第三个是 user_permissions

结构非常简单

$user = App\User::find(1)->first();
foreach($user->permissions as $permission){
    echo "Read".$permission->pivot->read."<br>";
    echo "Write".$permission->pivot->write."<br>";
    echo "Update".$permission->pivot->update."<br>";
    echo "Delete".$permission->pivot->delete."<br>";
}

这是显示用户权限的代码:

public function permissions()
{
    return $this->belongsToMany('App\Permission','user_permissions')->withPivot('read', 'create','update','delete');
}

当我以这种方式(在用户模型中)定义关系时,一切正常:

public function permissions()
{
    return $this->belongsToMany('App\Permission','user_permissions')->using('App\UserPermission');
}

但是我想以另一种方式写它,因为我不想选择我需要的字段我只想选择它们所以当我这样写它时我会收到一个错误:

android:layout_gravity="bottom|end"

这是我的错误:

Builder.php第2440行中的BadMethodCallException: 调用未定义的方法Illuminate \ Database \ Query \ Builder :: using()

2 个答案:

答案 0 :(得分:0)

  

我不想选择我需要的字段,我只想选择所有字段

如果您的意思是您不想指定数据透视表中存在哪些字段,而是让它自动发生 - 则不能。来自the 5.2 docs

  

默认情况下,只有模型键才会出现在数据透视对象上。如果数据透视表包含额外属性,则必须在定义关系时指定它们:

Same is still true in 5.4

答案 1 :(得分:0)

而不仅仅是:

return $this->belongsToMany('App\Permission','user_permissions')->withPivot('read', 'create','update','delete');

您可以在枢轴模型中定义常量/变量:

class UserPermission extends Pivot
{
    const PIVOT_ATTRIBUTES = [
        'read', 
        'create',
        'update',
        'delete'
    ];

    // . . .
}

然后:

public function permissions()
{
    return $this->belongsToMany(Permission::class, 'user_permissions')
        ->withPivot(UserPermission::PIVOT_ATTRIBUTES)
        ->using(UserPermission::class);
}

现在,您可以在PIVOT_ATTRIBUTES课程中更新UserPermission常量。