2017-04-13 15 views
4

私は、次のデータベース構造を使用しています:平坦化Laravel雄弁コレクション関係

映画
      - ID
      - タイトル

ディレクター
      - ID
 を    - 名前

movie_director
      - director_id       - movie_id

モデルは、このように設定されている

Movie.php

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Movie extends Model 
{ 
    public $table = "movie"; 

    /** 
    * The roles that belong to the user. 
    */ 
    public function directors() 
    { 
     return $this->belongsToMany('App\Director', 'movie_director'); 
    } 
} 

ディレクター。 PHP

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Director extends Model 
{ 
    public $table = "director"; 

    /** 
    * The roles that belong to the user. 
    */ 
    public function movies() 
    { 
     return $this->belongsToMany('App\Movie', 'movie_director'); 
    } 
} 

したがって、映画とディレクターの間には多対多の関係があります。

映画の詳細ページでは、元の映画の監督の他の映画を掲載したいと思います。

$movie = Movie::with('directors.movies')->find(1); 

私が必要とするすべてのデータを提供しますが、私は監督の収集とその監督の内側映画のコレクションを、ループをループしなければならない映画の完全なリストを取得します。これを行うより速く/簡単な方法はありませんか?

+0

たぶん私は何かが足りないんだけど、あなただけhttps://laravel.com/docs/5.4/collections#available-methodsあたりとして、その上に平らに使用したり、flatMapできないのですか? –

+0

はい、私は何ができるこのような何か: '$映画= $ movie-> directors-> flatMap(関数($ valの){$ val->映画返す;});' \t しかし、あなたが何を必要に応じて別のレベル、またはおそらく2レベル深く行く?次に、これらのフラットマップ関数の複数をネストする必要があります。私は実際にドット表記法を使うなど、より簡単な方法があることを本当に望んでいました。 – Lloyd

答えて

0

hasManyThroughを使用してMovieモデルにメソッドを追加して、ディレクターが関連する映画を取得する方法が考えられます。

public function relatedMovies() 
{ 
    return $this->hasManyThrough('App\Movie', 'App\Director'); 
} 

次に、ネストされた関係を熱心にロードするのではなく、その関係を個別に熱心にロードします。

$movie = Movie::with('directors', 'relatedMovies')->find(1);