10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-18

概要

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

終わりに

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

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?