2017-09-16 6 views
0

ここにシナリオがあります。テーブルFooと2つのカラムbarbazがあるとします。 barbazの両方の状態をチェックしたいと思います。この条件は、2つの列のいずれかにのみ当てはまります。どちらの列に当てはまる場合でも、もう一方の列を選択したいと思います。1つのクエリでWHERE句に基づいてSELECTする列を条件付きで選択するにはどうすればよいですか?

私はこのような二つの別々のクエリとしてこれを書くことができる:

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

(カラムは$valueに等しい場合、例示のために、私の例で条件がチェックされる。)

その後、私は2つのクエリの結果を取得し、それらをマージすることができると思います。しかし、実際にはPaginatorを使用したいと思っています。

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

をしかし、私はそこから条件付きでbarbazを選択する方法がわからない:

私はこれを使用してテーブルから関連するすべての行を選択することができます。私が求めている解決策は、上記の2つの方法の組み合わせであるようです。

Eloquentを使用して単一のクエリでこれを行うことは可能ですか?私は生のクエリを実行することができると思いますが、可能であれば、生のクエリから完全に離れています。ありがとう。

答えて

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

関連する問題