基本的には、ユーザーを取得して電子メールアドレスを熱心にロードし、where句を使用して取り込むユーザーを制限できるようにしたいと考えています。
$query = User::with('emails')->whereIn ('user_id', $user_ids);
$query->where('emails.email_address', 'LIKE', "%example%");
$usersWithEmails = $query->get();
これは機能します:
$query->where('first_name', 'LIKE', "%test%");
これにより、where句は基本ユーザーオブジェクトにのみ適用されていると思いますが、その電子メールに一致しないユーザーを取得したくありません。いくつかのクエリでこれを実行できることは承知していますが、これはUIフィルター用であり、多くの子テーブルでフィルター処理できるため、これははるかにうまく機能します)。
それ、どうやったら出来るの?
関係に基づいてユーザーをフィルタリングする必要がある場合、探しているのはwhereHas
です。
http://laravel.com/docs/5.0/eloquent#querying-relations
User::whereIn('id', [1, 3])->whereHas('emails', function ($query) {
$query->where('emails.email_address', 'LIKE', '%example%');
})->with('emails');
これにより、id = [1,3]のユーザーが選択され、電子メールパターンが一致しない結果が除外され、結果の行の関係が読み込まれます。
whereHas
and with
(Loganの例)の使用の違いは、後者はすべてのユーザーをロードしますが、積極的なロードパターンが一致しない場合、電子メールフィールドはNULLになります。
もちろん、積極的な読み込み制限を使用してコレクションをnullフィールドでフィルタリングすることで同じことを実現できますが、これはよりクリーンです。DBに仕事を任せます=)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加