如果一个表列为空,如何从另一表获取值

时间:2018-12-27 10:38:40

标签: php mysql laravel eloquent

我的数据库中有两个表

  1. 产品
  2. product_variations

两个都有价格列

如果任何产品有变化,则产品表中的价格列将为空,而变化中的价格列表将具有一定的价值。

但是,如果产品没有变化,则产品表的价格列将具有一定的价值,但变化表中的价格列将没有价值

我想获取所有价格从低到高的产品,反之亦然。

$shopProducts = product::where(
    [
        "publish" => 'PUBLISH',
        'shop_id' => input::get('shopId')
    ]
)->orderBy('price', 'asc')
->paginate(12);

上面的查询将正确返回所有产品,并将所有具有变化且价格列为空的产品放在最后。

但是我想要一个查询,该查询首先检查产品的价格列,如果它为null,然后转到产品变化表并搜索一个值,然后以desc或asc返回结果。

1 个答案:

答案 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不会为您消毒它们。