我正在尝试将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
语句,在括号内与AND
和OR
组合
我只想知道我是否对这样雄辩的查询是否做到了这一点
$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
语句的可选字段
答案 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功能。
祝你好运!