如何在单个查询中根据WHERE子句有条件地选择要SELECT的列?
问题描述:
这里是场景。假设我有一个表Foo
,有两列,bar
和baz
。我想检查bar
和baz
的条件。这种情况只适用于两列之一。无论哪列是真的,我想选择其他列。如何在单个查询中根据WHERE子句有条件地选择要SELECT的列?
我可以写为两个单独的查询,像这样:
$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
条件。看来我所寻求的解决方案将是上述两种方法的组合。
是否有可能在一个带有雄辩的单个查询中做到这一点?我想我可以执行原始查询,但如果可能的话,我宁愿远离原始查询。谢谢。
答
难道你不能只用你的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;
});
我给你的第一反应是说:我不想让'( )“结果马上,因为我想分页他们。但是,然后它打我,我可以分页'orWhere'的结果并循环。谢谢,看起来这是我的一个案例,超过了它! – cheryllium