2017-02-19 24 views
2

私はこの質問について助けを得ようとしましたが、私の質問を誤解しているとか、Eloquent/Laravelを使って達成しようとしていることを理解できていないと思います。Laravelが関係を検索する

各ユーザーには多くのカテゴリがあります。各カテゴリには多くの記事があります。 私は、ユーザーが持つ一連のカテゴリからすべての記事を取得したいと考えています。

だからユーザーはカテゴリー1、カテゴリー2を持っていると言う、私は以下これらbelongsToMany関係のそれぞれについて、カテゴリー1、カテゴリー2

からすべての記事を検索したい、私は自分のピボットテーブルを持っています。

article_categories

id |記事ID | categoryId

users_cats

id | user_details_id | categories_id

リレーションシップ。

Articles.php

public function categories() 
{ 
    return $this->belongsToMany('App\Categories', 'article_categories', 'articleID', 'categoryID'); 
} 

UserDetails.php

public function Categories() 
{ 
    return $this->belongsToMany('App\Categories', 'users_cats', 'user_details_id', 'categories_id'); 
} 

Categories.php

public function articles() 
{ 
    return $this->belongsToMany('App\Article', 'article_categories', 'categoryID', 'articleID'); 
} 

public function UserDetails() 
{ 
    return $this->HasMany('App\UserDetails', 'users_cats', 'user_details_id', 'categories_id'); 
} 

私は肝炎eはHasManyを使用しようとしましたが、私が知る限り、多対多の関係では機能しません。

現在、(「回避」の一種として)私はこれを使用しています。私はそれがでうまくスケールとは思わないしかし、私はUserDetails.php

$user = self::find($this->id); 
$user = $user->Categories; 

foreach ($user as $item) { 
    foreach ($item->articles as $article) 
     $article1[] = Article::find($article->id); 
} 

$articles = collect($article1)->sortByDesc('date')->unique(); 

return $articles; 

をユーザーのカテゴリのリストを引き上げ、IDSのすべてを検索し、関連する記事を引っ張って、それからコレクションを形成してきましたデータが増加しています(既に1000件の記事で1,000件以上のクエリを生成しており、ロードに8秒以上かかる)。

アイデア?

+0

あなたはなぜself :: findをやっているのでしょうか? Userモデルのインスタンスをインジェクトする代わりに? –

答えて

0

はこれで、機能を作ってみる:

public function User_all_artical($id){ 
     $aricles=DB::table('articles') //open articles table 
        ->join('categories',function($join) use ($id)){ //join to categories table 
         $join->on('articles.categoryID','=','categories.id')//where from articles table the categoryID column === categories table ID column 
          ->where('categories.userID',$id); //where categories have user id ==$id 
        } 
        ->get(); 

    } 
+0

ここでは、category_table.id_userのどこにあるべきか混乱しています。 私はカテゴリーと呼ばれるテーブルに自分のカテゴリーを持っていますが、それぞれIDを持っています。 私は雑誌にすべての記事を載せていますが、それぞれにIDがあります。 ' - >ここで( 'categories.user_details_id'、$ id)'? – user5067291

0

あなたがあなたのUserDetailsモデルに以下を追加することができNested eager loading

$user=User::with('categories.articles')->find(1); 
foreach($user->categories as $category) 
{ 
    echo $category->name; 
    forech($category->articles as $article) 
    { 
     echo $article->name; 
    } 
} 
+0

同じ/より長い読み込み時間を生成します。私はこれを使用しています。 'public function getUserArticles(){ $ user = \ App \ UserDetails :: with( 'categories.articles') - > find($ this-> id); foreach($ user-> categories> $ category){ echo $ category-> category; foreach($ category-> articlesとして$ article){ $ articlescol [] = $ article; } } return collect($ articlescol) - > sortByDesc( 'date') - > unique(); } ' – user5067291

+0

@ user5067291なぜあなたは' $ article'を配列に入れてコレクションにしていますか?日付順にソートしますか?あなたが達成しようとしていることを述べてください。 –

+0

私はブレードに渡すためにユーザーが持っているカテゴリに基づいて記事のコレクションを取得したい。 コレクションを日付順に並べ替えます。繰り返しはありません。 – user5067291

0

を使用することができます。

public function articles() 
{ 
    return $this->Categories()->getRelated()->articles()->getRelated() 
     ->whereHas('Categories', function ($query) { 
      $query->whereHas('UserDetails', function ($query) { 
       $query->where('id', $this->id); 
      }); 
     }); 
} 

この方法次の操作を実行できます:

$user->articles()->orderBy('date', 'desc')->get(); 

希望します。