2017-02-19 106 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(); 

希望这有助于!