Laravel从RAW查询到口才查询

时间:2020-07-30 21:43:08

标签: php mysql sql laravel

我正在尝试将Raw query转换为eloquent query

您可以在这里看到

 $data = DB::connection('mysql')->select("SELECT product.id, product.title, product.description, product.content, product.photo, product_per_category.productcategory_id, product.quantity, product.price 
        FROM product LEFT JOIN product_per_category ON product_per_category.product_id = product.id
        WHERE product.deleted = 0 AND product_per_category.deleted = 0 AND productcategory_id = '$id' AND (product.title like '%$keyword%' OR product.content like '%$keyword%' OR product.price like '%$keyword%' OR product.quantity like '%$keyword%')
        
        GROUP BY product.id");

我有多个WHERE语句,在括号内与ANDOR组合

我只想知道我是否对这样雄辩的查询是否做到了这一点

 $data = DB::table('product')
    ->select('product.id','product.title','product.description','product.content','product.photo','product.quantity','product.price')
    ->join('product_per_category','product_per_category.product_id','=','product.id')
    ->where(['product.deleted' => 0])
    ->where(['product_per_category.deleted' => 0])
    ->where(['product_per_category.productcategory_id' => $id])
    ->orWhere('product.content', 'like', '%' . $keyword . '%')
    ->orWhere('product.title', 'like', '%' . $keyword . '%')
    ->orWhere('product.quantity', 'like', '%' . $keyword . '%')
    ->orWhere('product.price', 'like', '%' . $keyword . '%')
    ->groupBy('product.id')
    ->get();

因为我想知道查询中的OR语句放在括号内。

我将它们合并在括号内,以使其仅是LIKE语句的可选字段

2 个答案:

答案 0 :(得分:1)

您可以在where方法内传递闭包闭包将收到一个查询生成器实例,您可以使用该实例来设置应包含在括号中的约束。

这被称为parameter grouping

https://laravel.com/docs/7.x/queries#parameter-grouping

将您的声明更改为此。

$data = DB::table('product')
    ->select('product.id','product.title','product.description','product.content','product.photo','product.quantity','product.price')
    ->join('product_per_category','product_per_category.product_id','=','product.id')
    ->where(['product.deleted' => 0])
    ->where(['product_per_category.deleted' => 0])
    ->where(['product_per_category.productcategory_id' => $id])
    ->where(function($query) use($keyword){
        $query->where('product.content', 'like', '%' . $keyword . '%')
              ->orWhere('product.title', 'like', '%' . $keyword . '%')
              ->orWhere('product.quantity', 'like', '%' . $keyword . '%')
              ->orWhere('product.price', 'like', '%' . $keyword . '%');
    })
    ->groupBy('product.id')
    ->get();

答案 1 :(得分:1)

您已经很接近了,但是当您需要在括号之间有条件时,您的where()函数应该是一个回调。

例如(product.title like '%$keyword%' OR product.content like '%$keyword%' OR product.price like '%$keyword%' OR product.quantity like '%$keyword%') 会是

$query->where(function($subquery) use($keyword) {
    $subquery->where('title', 'like', "%{$keyword}%")
    ->orWhere('content', 'like', "%{$keyword}%");
});

这只是您要求的一个粗略示例,但您应该了解它。

就这样,您可以组合几乎所有Eloquent功能。

祝你好运!