同一查询中连接和左连接的两个语法问题
two syntax problems with join and left-join in the same query
我有这个代码来创建一个集合:
$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 on 子句中的列 'entity_id' 不明确:
[2015-01-01 13:22:28] production.ERROR:致命数据库错误:500 = SQLSTATE[23000]:违反完整性约束:1052 on 子句中的列 'entity_id' 不明确(SQL: select entities.*, SUM(user_attitudes.importance) AS importance from entities
inner join entity_capacitytypes
on entity_id
= entities
.id
and capacitytypes_id
= 23 left join user_attitudes
on entity_id
= entities
.id
and item_type
= entity group by entities
.id
按 importance
desc 限制排序 6) [] []
我花了一个多小时才找到绕过问题的技巧:
我被迫将 table entity_capacitytypes 中的列名从 entity_id 中更改(这导致了问题)到 entitys_id 只是为了避免这个错误。
现在我的数据库名称不一致。还有其他避免错误的方法吗?
问题 2:
如果我将这部分添加到查询中,并尝试在 where 行
中使用以前完美工作的变量
join('entity_capacitytypes', function($q){
$q->on('entitys_id', '=', 'entities.id');
$q->where('capacitytypes_id','=', $capacity);
})->
我收到这个错误:
未定义变量:容量
变量如何工作?
我的解决办法:再次回避。
我无法修复连接,所以我使用了 Capacitytype 模型中定义的关系:
public function entities()
{
return $this->belongsToMany('Entity', 'entity_capacitytypes', 'capacitytypes_id', 'entitys_id');
}
而不是使用连接,我从另一个模型访问实体
$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();
待办事项:
使变量在 join 中起作用
问题 1
要解决“模糊列”问题,您只需指定完整的列名,包括 table
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);
})
我有这个代码来创建一个集合:
$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 on 子句中的列 'entity_id' 不明确:
[2015-01-01 13:22:28] production.ERROR:致命数据库错误:500 = SQLSTATE[23000]:违反完整性约束:1052 on 子句中的列 'entity_id' 不明确(SQL: select entities.*, SUM(user_attitudes.importance) AS importance from entities
inner join entity_capacitytypes
on entity_id
= entities
.id
and capacitytypes_id
= 23 left join user_attitudes
on entity_id
= entities
.id
and item_type
= entity group by entities
.id
按 importance
desc 限制排序 6) [] []
我花了一个多小时才找到绕过问题的技巧: 我被迫将 table entity_capacitytypes 中的列名从 entity_id 中更改(这导致了问题)到 entitys_id 只是为了避免这个错误。 现在我的数据库名称不一致。还有其他避免错误的方法吗?
问题 2:
如果我将这部分添加到查询中,并尝试在 where 行
中使用以前完美工作的变量join('entity_capacitytypes', function($q){
$q->on('entitys_id', '=', 'entities.id');
$q->where('capacitytypes_id','=', $capacity);
})->
我收到这个错误: 未定义变量:容量
变量如何工作?
我的解决办法:再次回避。
我无法修复连接,所以我使用了 Capacitytype 模型中定义的关系:
public function entities()
{
return $this->belongsToMany('Entity', 'entity_capacitytypes', 'capacitytypes_id', 'entitys_id');
}
而不是使用连接,我从另一个模型访问实体
$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();
待办事项:
使变量在 join 中起作用
问题 1
要解决“模糊列”问题,您只需指定完整的列名,包括 table
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);
})