2017-09-16 33 views
0

这里是场景。假设我有一个表Foo,有两列,barbaz。我想检查barbaz的条件。这种情况只适用于两列之一。无论哪列是真的,我想选择其他列。如何在单个查询中根据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); 

但是当时我不知道如何从中选择barbaz条件。看来我所寻求的解决方案将是上述两种方法的组合。

是否有可能在一个带有雄辩的单个查询中做到这一点?我想我可以执行原始查询,但如果可能的话,我宁愿远离原始查询。谢谢。

回答

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; 
    }); 
+0

我给你的第一反应是说:我不想让'( )“结果马上,因为我想分页他们。但是,然后它打我,我可以分页'orWhere'的结果并循环。谢谢,看起来这是我的一个案例,超过了它! – cheryllium

相关问题