2017-02-19 91 views
2

我試圖在這個問題上得到幫助,但我認爲人們要麼誤解我的問題,要麼不太明白我想要實現的東西,用Eloquent/Laravel。Laravel通過關係尋找

每個用戶都有很多類別。每個類別都有很多文章。 我想從用戶擁有的一組類別中檢索所有文章。

所以說用戶有1類,2類,我想要從1類和第2

對於以下這些belongsToMany關係的所有文章,我有自己的數據透視表。

article_categories

id | articleID | 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,但根據我的情況,它不適用於多對多的關係。

目前(作爲一種「解決」)我一直在使用這個。我已經拉起了用戶的類別列表,並通過所有ID的搜索和拉動相關文章和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; 

從它形成一個集合但是我不認爲這將很好地擴展增加數據(它已經產生超過1k的查詢,只有1000篇文章,需要8秒才能加載)。

任何想法?

+0

只是想知道你爲什麼要做自我::發現?而不是注入用戶模型的實例? –

回答

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。 我有我的文章在journalarticles,每個人都有一個ID。 應該是' - > where('categories.user_details_id',$ id)'?它如何知道使用數據透視表 – user5067291

0

您可以使用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

產生相同/更長的加載時間。我正在使用這個。 ('categories.articles') - > find($ this-> id); $ user = \ App \ UserDetails :: with('categories.articles') - > find($ this-> id); foreach($ user-> categories as $ category){ echo $ category-> category; foreach($ category-> articles as $ article){ $ articlescol [] = $ article; } } return collect($ articlescol) - > sortByDesc('date') - > unique(); }' – user5067291

+0

@ user5067291你爲什麼要在數組中放置'$ article'並使之集合?然後按日期排序?陳述你想達到什麼目標。 –

+0

我想基於用戶傳遞給刀片的類別檢索文章集合。 按日期排序集合。沒有重複。 – user5067291

0

您可以添加以下到您的UserDetails型號:

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(); 

希望這有助於!