4

関連モデルでLaravelのEloquent ORMで結果セットをフィルタリングすることは可能ですか? Eloquent がテーブルを結合しないことは理解していますが、希望する結果は次のようになります。

SELECT * FROM ticket JOIN statuses on ticket.status_id = statuses.id WHERE statuses.name != 'Closed';

Eloquent で見つけた最も近い機能は次のとおりです。

$tickets = Ticket::with(array('status' => function($q) {
    return $q->where('name', '!=', 'Closed');
}))->get();

これでもすべてのチケットが返されますが、名前がクローズされていない場合はステータス関係のみが返されます。

また、これは Fluent で実行できることはわかっていますが、Eloquent が提供するネストされたオブジェクトの返された構造を使用したいと考えています。

echo ticket->status->name;

Fluent は、結合されたクエリのようにフラット化された結果を返します。

4

6 に答える 6

4

この質問は古いようですが、ここで本当の答えを探している場合は、データベースへのクエリが多すぎないように最善を尽くす必要があります。受け入れられた答えは2回実行しますが、次のように1回のショットでこれを実行できますこれ

$tickets = Ticket::with('status')->whereHas('status', function($q) {
    return $q->where('name', '!=', 'Closed');
})->get();
于 2015-10-13T20:43:17.480 に答える
2

複雑にしようとしてた気がする。

$statuses = Status::where('name', '!=', 'Closed')->list('id');
$tickets = Ticket::with('status')->whereIn('status_id', $statuses)->get();

または、ステータスの方向に進むこともできます...これはあまりやりたくありませんが、クエリ数を減らすことができます:

$statusTickets = Status::with('ticket')->where('name', '!=', 'Closed')->get();
于 2013-06-24T18:44:25.373 に答える
1

モデルで newQuery をオーバーライドして、追加のクエリがすべての get() メソッドに適用されるようにすることができます - http://usman.it/filter-eloquent-results-overriding-laravel/を参照してください

于 2013-07-30T23:04:40.133 に答える
0

モデルのリレーションにクエリ スコープを追加してみてください。 ララベル。関係のあるモデルで scope() を使用する

ララベル 4.2+

于 2015-01-12T08:09:36.733 に答える