我的数据库中有两个表
两个都有价格列。
如果任何产品有变化,则产品表中的价格列将为空,而变化中的价格列表将具有一定的价值。
但是,如果产品没有变化,则产品表的价格列将具有一定的价值,但变化表中的价格列将没有价值
我想获取所有价格从低到高的产品,反之亦然。
$shopProducts = product::where(
[
"publish" => 'PUBLISH',
'shop_id' => input::get('shopId')
]
)->orderBy('price', 'asc')
->paginate(12);
上面的查询将正确返回所有产品,并将所有具有变化且价格列为空的产品放在最后。
但是我想要一个查询,该查询首先检查产品的价格列,如果它为null,然后转到产品变化表并搜索一个值,然后以desc或asc返回结果。
答案 0 :(得分:0)
我不知道使用查询生成器执行此操作的完全本机方法,但是如果您使用的是sql数据库,则应该能够使用原始case语句执行此操作。例如...
$shopProducts = product::SELECT(
DB::raw("CASE WHEN product_variations.price IS NULL THEN product.price ELSE product_variations.price END AS price")
)->where(
[
"publish" => 'PUBLISH',
'shop_id' => input::get('shopId')
]
)->orderByRaw('CASE WHEN product_variations.price IS NULL THEN product.price ELSE product_variations.price END', 'asc')
->paginate(12);
应该与mssql或mysql一起使用,并且大多数数据库都支持某种类型的相似语法。您只需要在select语句中添加任何其他所需的列即可。您还需要加入product_variations表,此方法才能起作用。
原始选择和原始订单均绕过Laravel的查询构建器,并将您的语句直接传递到数据库,因此请小心如何构造查询。 Laravel不会为您消毒它们。