我在Laravel Eloquent中有下一个查询:
$buildings = Building::select('buildings.*')->join(
DB::raw('('.
(
IngameBuilding::select('buildings.building_id', 'buildings.level')
->join('buildings', 'buildings.id', '=', 'ingame_buildings.building_id')
->toSql()
).
') as `added_buildings`'), 'added_buildings.building_id', '=', 'buildings.building_id')
->where('buildings.level', '>', 'added_buildings.level')
->get();
此查询返回base中允许的所有行,但更多行。当我在DB::raw()
中添加where()
时,返回值有效。
良好的代码:
$buildings = Building::select('buildings.*')->join(
DB::raw('('.
(
IngameBuilding::select('buildings.building_id', 'buildings.level')
->join('buildings', 'buildings.id', '=', 'ingame_buildings.building_id')
->toSql()
).
') as `added_buildings`'), 'added_buildings.building_id', '=', 'buildings.building_id')
->where('buildings.level', '>', DB::raw('`added_buildings`.`level`'))
->get();
为什么第一个代码workig,嗯..错了?
答案 0 :(得分:0)
我根本不是Laravel的忠实粉丝。
我对这个框架只有很少的经验,但我几乎可以肯定where
函数只接受一个常数'要检查的值。
如果您在查询对象上使用toSQL
方法获得此查询的输出,您将看到eloquent将其转换为如下内容:
(...) where buildings.level > 'added_buildings.level'
所以条件检查buildings.level
(无论类型是什么)
大于给定的字符串而不是列值。
使用DB::raw
您正在获取正确的sql,因为该说服者不会解析/转换它。
我想要使用whereRaw
方法。
http://laravel.com/docs/4.2/queries#introduction