2018/10/12

Laravelで開発をしている中で、リレーション先のテーブルのカラムに対して検索をかけたいことが発生しました。
これが結構はまってしまいました。
今回は「リレーション先のテーブルに対して検索をかけたい」ケースついてエントリーします。
状況
データベース
部署テーブル:depts
従業員テーブル:employees
【 ポイント 】
部署テーブルにある stairs カラムはどの階にあるかという意味です。
今回はこのカラムがキーポイントになります。
部署テーブルにある stairs カラムはどの階にあるかという意味です。
今回はこのカラムがキーポイントになります。
モデル
class Dept extends Model
{
//hasMany設定
public function employees()
{
return $this->hasMany('App\Employee');
}
}
class Employee extends Model
{
//belongsTo設定
public function dept()
{
return $this->belongsTo('App\Dept');
}
}
やりたいこと
1階で働いている人を抽出したい。
=(リレーション先のテーブル(depts)にある stairs カラムで検索したい。)
問題
リレーション先のテーブル(depts)にあるカラム(stairs)で検索をかけるとします。
public function select(){
$employees = \App\Employee::where('stairs','1')->get();
return view('employee.list')->with('employees',$employees);
}
実行結果
エラーになりました。
stairsカラムがないというメッセージが表示されています。
Eloquentモデルでリレーションをしてもリレーション先のテーブルは検索対象にはならないのです。
解決策
whereHasを利用します。
【 構文 】
whereHas($relation, Closure $callback)
リレーション先のテーブルに検索条件を詳細に指定する際に使用するメソッド。
クロ―ジャーの中にリレーション先のカラムの条件を指定してあげます。
whereHas($relation, Closure $callback)
リレーション先のテーブルに検索条件を詳細に指定する際に使用するメソッド。
クロ―ジャーの中にリレーション先のカラムの条件を指定してあげます。
public function select(){
$employees = \App\Employee::whereHas('Dept', function($q){
$q->where('stairs', 1);
})->get();
【 解説 】
Eloquentモデルの結合を使うのではなく、クエリービルダーのJoin句でもOKです。
Eloquentモデルの結合を使うのではなく、クエリービルダーのJoin句でもOKです。
$employees = \App\Employee::select()
->join('depts','depts.id','=','employees.dept_id')
->where('stairs',1)
->get();
実行結果
リレーション先のテーブルにおける条件検索に関しては以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。


