在同一查询中使用join和left-join的两个语法问题

时间:2015-01-01 14:14:03

标签: mysql join laravel left-join

我有这个代码来创建一个集合:

$rank_entities_by_capacity = Entity::join('entity_capacitytypes', function($q){
     $q->on('entitys_id', '=', 'entities.id');
     $q->where('capacitytypes_id','=', '23');
 })->
leftJoin('user_attitudes', function($q){
                $q->on('entity_id', '=', 'entities.id');
                $q->where('item_type', '=', 'entity');
            })
            ->selectRaw('entities.*, SUM(user_attitudes.importance) AS importance')
            ->groupBy('entities.id')
            ->orderBy('importance', 'desc')
            ->take(6)
            ->get(); 

第一个问题:

1052专栏' entity_id' in on子句含糊不清:

[2015-01-01 13:22:28] production.ERROR:FATAL DATABASE ERROR:500 = SQLSTATE [23000]:完整性约束违规:1052列' entity_id' on on子句是不明确的(SQL:选择实体。*,SUM(user_attitudes.importance)来自entities entity_capacitytypes entity_id entities id capacitytypes_id的重要性{{1} }和user_attitudes = 23在entity_id = entities iditem_type = entities上的实体组id左侧加入importancejoin('entity_capacitytypes', function($q){ $q->on('entitys_id', '=', 'entities.id'); $q->where('capacitytypes_id','=', $capacity); })-> public function entities() { return $this->belongsToMany('Entity', 'entity_capacitytypes', 'capacitytypes_id', 'entitys_id'); } desc limit 6)[] []

排序

我花了一个多小时的时间寻找绕过问题的技巧: 为了避免此错误,我被迫将表 entity_capacitytypes 中的列名从 entity_id (它导致问题)更改为 entitys_id 。 现在我的数据库名称不一致。还有其他方法可以避免错误吗?

问题2:

如果我将此部分添加到查询中,并尝试在其中行中使用以前完美的工作变量

 $rank_entities_by_capacity = Capacitytype::find($capacity)->entities()->
leftJoin('user_attitudes', function($q){
                $q->on('entity_id', '=', 'entities.id');
                $q->where('item_type', '=', 'entity');
            })
            ->selectRaw('entities.*, SUM(user_attitudes.importance) AS importance')
            ->groupBy('entities.id')
            ->orderBy('importance', 'desc')
            ->take(6)
            ->get(); 

我收到此错误: 未定义变量:容量

如何使变量有效?

我的解决方案:再次避免。

我不能修复连接,所以我使用了Capacitytype模型中定义的关系:

{{1}}

而是使用join,我从另一个模型

访问了Entity
{{1}}

要做:

使变量在连接中起作用

1 个答案:

答案 0 :(得分:1)

问题1

修复"不明确的列"问题你只需要指定包括表格的完整列名称

entity_capacitytypes.entity_id而非entity_id

问题2

要在闭包(也称为匿名函数)中使用$capacity之类的局部变量,您需要使用use

注入它们
join('entity_capacitytypes', function($q) use ($capacity){
    $q->on('entitys_id', '=', 'entities.id');
    $q->where('capacitytypes_id','=', $capacity);
})