2017-09-16 61 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

相關問題