Help us understand the problem. What is going on with this article?

Laravelのwith句の条件指定部分にaliasをつけたい

More than 1 year has passed since last update.

概要

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');
}

以下のようにしてみた。

修正後(これはNG)
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']);

終わりに

とりあえずできたのですが、なんでこうなるかわかる人がいればコメントで教えてください。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away