这是场景。我们假设我有一个包含两列Foo
和bar
的表baz
。我想检查bar
和baz
上的条件。这种情况只适用于两列中的一列。无论哪一列都是如此,我想选择另一列。
我可以将它写成两个单独的查询,如下所示:
$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);
但后来我不知道如何从那里有条件地选择bar
或baz
。似乎我寻求的解决方案将是上述两种方法的某种组合。
是否可以在Eloquent的单个查询中执行此操作?我想我可以执行原始查询,但如果可能的话,我宁愿远离原始查询。感谢。
答案 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;
});