概要
LaravelのEagerLoadingを利用してデータを取得したいが、条件指定を含む連結部に別名(Alias)をつけたい、ということをしようとしたときに困ったので皆さんに共有。
本題
Laravelにおいてwith句を利用するときに条件指定をする際は、以下のようにすることで条件指定ができる。ここでは、hogeというテーブルがあるとして、fugaというテーブルを連結することを考える。
// fugaというテーブルを連結させたいが、
// statusは1のデータのみ連結したい、といった場合
Hoge::with(['fuga' => function($query) {
$query->where('status', 1);
}]);
これでも良いのだが、このデータにアクセスする際は、[hogeのデータの実態]->fuga
のような形で連結したデータにアクセスすることになる。しかしながら、->fuga
だけでは、fugaが「status=1
のデータのみである」ということがわからないため、視認性を高めるために->fuga_status_1
としたい。
そこで、以下のようになっている部分を変更して、
public function fuga() {
return $this->belongsTo('App\Fuga');
}
以下のようにしてみた。
public function fuga_status_1() {
return $this->belongsTo('App\Fuga')->where('status', 1);
}
fuga()
はもともと動いていたし、これでいけるでしょ、と思ったのだが、これでは->fuga_status_1
にアクセスしてもnullが返却されてしまう。
うまく動いた方法は以下。
条件を指定するときは、Eloquentのリレーションの定義と別々に書いてあげないといけなかった。
public function fuga() {
return $this->belongsTo('App\Fuga');
}
public function fuga_status_1() {
return $this->fuga()->where('status', 1);
}
これで、[hogeのデータの実態]->fuga_status_1
というデータの取得ができるようになり、連結されるfugaがどんなデータであるかは、変数名をみただけで明らかになる。
Hoge::with(['fuga_status_1']);
終わりに
とりあえずできたのですが、なんでこうなるかわかる人がいればコメントで教えてください。