【问题标题】:Laravel Defining Custom Intermediate Table ModelsLaravel 定义自定义中间表模型
【发布时间】:2026-01-23 14:55:02
【问题描述】:

我正在尝试使用 Eloquent 获取用户权限

我有 3 张桌子,

第一个是users表,

第二个是权限

第三个是user_permissions

结构很简单

users
-id
-name

permissions
-id
-name

user_permissions
-user_id
-permission_id
-read
-write
-update
-delete

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

$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');
}

这是我的错误:

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

【问题讨论】:

  • 你有什么 Laravel 版本?

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


【解决方案1】:

我不想选择我需要的字段我只想选择它们全部

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

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

Same is still true in 5.4.

【讨论】:

  • 这是我在这里尝试做的: return $this->belongsToMany('App\Permission','user_permissions')->using('App\UserPermission');但它不工作
  • 我不熟悉 using 方法,我在文档中找不到任何关于它的信息...记录在哪里?
  • 谢谢,不知道,好像是5.4的新东西?那么你的UserPermission 模型是什么样的呢?
【解决方案2】:

不仅仅是:

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);
}

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

【讨论】:

  • using(...) 仅在 laravel 5.4 中可用,laravel 5.3 会给你Call to undefined method Illuminate\Database\Query\Builder::using()