如何在单个查询中有条件地选择基于WHERE子句的SELECT列?

时间:2017-09-16 01:49:50

标签: php mysql laravel orm eloquent

这是场景。我们假设我有一个包含两列Foobar的表baz。我想检查barbaz上的条件。这种情况只适用于两列中的一列。无论哪一列都是如此,我想选择另一列。

我可以将它写成两个单独的查询,如下所示:

$one = Foo::select('bar as qux')->where('baz', $value);
$two = Foo::select('baz as qux')->where('bar', $value);

(为了便于说明,我的示例中的条件是检查列是否等于$value。)

之后,我想我可以得到两个查询的结果并合并它们。但是,我真的想使用Paginator,以及其他原因,希望它是一个单一的查询。

我可以使用以下方法从表中选择所有相关行:

$rows = Foo::where('baz', $value)->orWhere('bar', $value);

但后来我不知道如何从那里有条件地选择barbaz。似乎我寻求的解决方案将是上述两种方法的某种组合。

是否可以在Eloquent的单个查询中执行此操作?我想我可以执行原始查询,但如果可能的话,我宁愿远离原始查询。感谢。

1 个答案:

答案 0 :(得分:0)

你是不是只使用你的orWhere查询而只是循环检查结果是否合适?

$rows = Foo::where('baz', $value)->orWhere('bar', $value)->get();

foreach($rows as $row) {
   $qux = ($row->bar == $value) ? $row->baz : $row->bar;
   // do something with $qux
}

如果您希望更加以对象为中心,可以将属性qux映射到每一行:

$rows = Foo::where('baz', $value)->orWhere('bar', $value)
    ->get()
    ->map(function($row) {
        $row->qux = ($row->bar == $value) ? $row->baz : $row->bar;
        return $row;
    });