在第二个参数中使用DB :: raw()时的不同值where()

时间:2015-09-05 18:41:17

标签: php laravel orm eloquent laravel-5.1

我在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,嗯..错了?

1 个答案:

答案 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