2017-09-25 10 views
1

ログイン、ID、年齢などの属性を持つモデルUserがあります。別のテーブルはuser_dataで、たとえばresidenceの列です。関係の値を照合してLaravelモデルを取得するにはどうすればよいですか?

特定の住居を持つすべてのユーザーを取得するにはどうすればよいですか?私はこれを持っている:

Userモデル:

public function user_data() 
{ 
    return $this->hasMany('App\Models\UserData'); 
} 

public function FilterUser($request) 
{ 
    if ($request->has('city')) 
    { 
     $users = User::with('user_data')->where('residence', 'Warsaw')->get();   
    } 

    dd($users); 
} 

UserDataモデル:

Column not found: 1054 Unknown column 'residence' in 'where clause' (SQL: select * from `users` where `residence` = warsaw and `users`.`deleted_at` is null)

そして、別の質問:

public function user() 
{ 
    return $this->belongsTo('App\User', 'user_id'); 
} 

は今、私はこのエラーを取得しますUserが私のメインモデルの場合は、上記のような関係で接続する必要がありますか? hasMany()またはbelongsTo()

+0

それを得るために、SQL squeryください:あなたは、私はそれを多くの時間を試した上で見るようにhttps://laravel.com/docs/5.5/queries – Peter

+0

@peterを、しかし、それはwではないork – browinski

答えて

1

whereHas()クエリビルダメソッドを使用します -

$users = User::with('user_data') 
    ->whereHas('user_data', function($query) { 
     $query->where('residence', 'Warsaw'); 
    }) 
    ->get(); 

編集をあなたはwhereHas()のため閉鎖に変数をインポートする必要が$requestから値を使用するには:

... 
    ->whereHas('user_data', function($query) use ($request) { 
     $query->where('residence', $request->city); 
    }) 
    ... 

編集 - query scopeをしてもよいですよりよいアプローチになります。あなたが関係を持つすべてのユーザーを取得したい場合

User::inCity($request->city)->get(); 
+0

それは動作します。しかしワルシャワを$ request-> cityに変更するには? 私は関数のパラメータとして$ requestを持っていますput idは今動作しません – browinski

+0

この例を表示するように更新しました! –

+0

最後の質問です。私は$ user-> idのような何かをすることができません: プロパティ[ID]はこのコレクションインスタンスに存在しません 正しく行う方法? – browinski

0

使用whereHas:

function scopeInCity($query, $city) 
{ 
    return $query->whereHas('user_data', function($q) use ($city) { 
     $q->where('residence', $city); 
    }); 
} 

は、あなたが(モデル外)市で、すべてのユーザーをフィルタすることができますUserモデルでは、このメソッドを追加そのような特定の属性を持つ:

$users = User::whereHas('user_data', function($q) { 
$q->where('residence', 'Warsaw');})->get(); 
関連する問題