将原始查询转换为laravel

时间:2017-01-30 14:26:02

标签: php laravel laravel-5.3

我有这个架构

product_categories

id | product_category
---------------------
1  | ABC
2  | DBC
3  | EBA

store_product_categories

id | category_id | store_id
------------------------
1  | 2        | 11
2  | 1        | 11
3  | 3        | 11

我在mysql工作台上创建了一个查询

SELECT pc.* FROM product_categories pc LEFT JOIN store_product_categories spc ON pc.category = pc.id AND spc.store_id = 11 WHERE spc.category IS NULL;

此查询实际上从product_categories表中获取store_product_categories中不存在的所有类别。

现在我真的很困惑如何构建这个是Laravel Eloq ..

我确实试过了。

$exclusive_categories = Product_category::join('store_product_categories','store_product_categories.category_id','=','product_categories.id')
        ->where('store_product_categories.store_id','=',session('store_id'))
        ->where('store_product_categories.category_id','=','NULL')->get();

但这并没有给我结果

3 个答案:

答案 0 :(得分:1)

由于你要加入两个不同的列,你需要通过函数/闭包传递它:

$exclusive_categories = Product_category::leftJoin('store_product_categories', function($join) {
    $join->on('store_product_categories.category_id','=','product_categories.id')
     ->on('store_product_categories.store_id','=',session('store_id'));
})
    ->where('store_product_categories.store_id','=','NULL')->get();

我不确定这是不是你想要的。如果您正在寻找store_id为NULL或store_id =会话ID的位置,您可以通过另一个闭包/函数传递它。

答案 1 :(得分:0)

$exclusive_categories = Product_category::leftJoin('store_product_categories','store_product_categories.category_id','=','product_categories.id')
        ->where('store_product_categories.store_id','=',session('store_id'))
        ->whereNull('store_product_categories.store_id')->get();

https://laravel.com/docs/5.3/queries

答案 2 :(得分:0)

$exclusive_categories = Product_category::leftJoin('store_product_categories spc', function ($join) {
            $join->on('spc.category_id', '=', 'product_categories.id');
            $join->on('spc.store_id', '=', \DB::raw(session('store_id')));
        })
        ->whereNull('spc.category_id')
        ->get(['product_categories.*']);