Laravel 4离开了加入mySQL语句没有正确返回

时间:2014-02-05 03:11:40

标签: php mysql laravel-4

我对Laravel的查询构建器缺乏经验感到有点沮丧。我有一个mySQL语句,可以很好地比较两个几乎相同的表,用于任何缺少的行。但是Laravel版本对我不起作用。

基本上我有两张桌子test_1& test_2,每个都有列:id,name&颜色。我想列出任何缺失的行。这是表结构:

表:test_1

test_1

表:test_2

test_2

这是mySQL(这很好用),它返回:'4 | birgit |黄色“

SELECT a.*
FROM test_1 a
LEFT JOIN test_2 b ON b.name = a.name
WHERE b.id is NULL

这是我认为应该是Laravel的等价物(不工作 - 它返回一个对三个属性中的每一个都具有空值的对象):

$test = DB::table('test_1')
    ->leftJoin('test_2', 'test_2.name', '=', 'test_1.name')
    ->where('test_2.id', null)
    ->get();

我的下一步是比较名称相同但两个表之间的颜色不同,这也不起作用。我们非常感谢您提供的任何帮助。谢谢!

$test = DB::table('test_1')
    ->leftJoin('test_2', 'test_2.name', '=', 'test_1.name')             
    ->where('test_2.color', '!=', 'test_1.color')
    ->get();

更新:使用DB :: raw方法(如下)按预期工作。

$test2 = DB::select( DB::raw('SELECT a.* FROM test_1 a LEFT JOIN test_2 b ON b.name = a.name WHERE a.color != b.color'));
$test3 = DB::select( DB::raw('SELECT a.* FROM test_1 a LEFT JOIN test_2 b ON b.name = a.name WHERE b.id is NULL'));

1 个答案:

答案 0 :(得分:0)

您获得NULL值,因为这些是table_2中没有匹配项时的值。您需要手动别名并从table_1中选择列。

$results = DB::table('table_1')
            ->leftJoin('table_2', 'table_2.id', '=', 'table_1.id')
            ->where('table_2.id')
            ->select('table_1.id AS id', 'table_1.name AS name', 'table_2.color AS color')
            ->get();