未找到列:Laravel 5 多对多关系查询中“on 子句”中的 1054 未知列“managers.id”

Posted

技术标签:

【中文标题】未找到列:Laravel 5 多对多关系查询中“on 子句”中的 1054 未知列“managers.id”【英文标题】:Column not found: 1054 Unknown column 'managers.id' in 'on clause' in Laravel 5 Many-to-Many relationship query 【发布时间】:2016-01-11 02:43:57 【问题描述】:

我是 laravel 的新手。我正在开发这个 laravel 5 应用程序,但我被困在这里。

我有两个雄辩的模型

class Manager extends Eloquent

    public function supervisors()
    
        return $this->belongsToMany('App\Supervisor')->withTimestamps();
    



class Supervisor extends Eloquent 

    public function managers()
    
        return $this->belongsToMany('App\Manager');
    

经理和主管之间存在多对多关系。我遵循 laravel 5 文档并按预期创建了我的表。

例如 经理表结构

user_id PK(来自用户表的 FK(引用 id)) 等级

主管表结构

user_id PK(来自用户表的 FK(引用 id)) 卓越

数据透视表结构(manager_supervisor)

manager_id PK(来自 Manager 表的 FK(引用 user_id)) supervisor_id PK(来自 Supervisor 表的 FK(引用 user_id))

当我执行以下查询时,结果与预期不符

 $user = App\User::find(2);
 $user->supervisor->managers;

样本结果:

Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'managers.id' in 'on clause' (SQL: select `managers`.*, `manager_supervisor`.`supervisor_id` as `pivot_supervisor_id`, `manager_supervisor`.`manager_id` as `pivot_manager_id` from `managers` inner join `manager_supervisor` on `managers`.`id` = `manager_supervisor`.`manager_id` where `manager_supervisor`.`supervisor_id` is null)'

我期待“on 子句”返回类似

的内容
managers`.`user_id` = `manager_supervisor`.`manager_id` where `manager_supervisor`.`supervisor_id` is 2

我在这里缺少什么?真正的问题是什么?

【问题讨论】:

这有点棘手,因为我个人不会这样设置我的桌子。但是,Laravel 会查找名为 id 的主键,因此如果您使用具有不同名称的主键,则需要在模型中设置主键:$primaryKey='user_id'; 非常感谢@craig_h。添加变量有效。我开始在组织我的表格时遇到不必要的复杂性。它是每个类一个表的继承。你会建议我如何整理我的桌子? 【参考方案1】:

我需要做的就是在两个模型中设置一个主变量:

class Manager extends Eloquent

    protected $primaryKey = 'user_id';

    public function supervisors()
    
        return $this->belongsToMany('App\Supervisor')->withTimestamps();
    



class Supervisor extends Eloquent 

    protected $primaryKey = 'user_id';

    public function managers()
    
        return $this->belongsToMany('App\Manager');
    

【讨论】:

以上是关于未找到列:Laravel 5 多对多关系查询中“on 子句”中的 1054 未知列“managers.id”的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 中的多对多关系获取列值

在 Laravel 中查询用户的多对多关系

在 laravel 中搜索查询并计算结果的多对多关系

在 Laravel 4 中如何查询多对多关系?

Laravel 多对多关系查询

刀片模板中的多对多关系中的 Laravel 嵌套查询