关系HasManyThrough与多对多关系

时间:2017-02-11 21:57:48

标签: laravel eloquent

每篇文章属于许多类别。每个用户都有很多类别。 我想检索所有具有用户类别的文章。对于下面这些关系中的每一个,我都有自己的数据透视表。

article_cat

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

我已经尝试过使用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秒)。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用IN查询。或子查询。

Article::whereIn('id', $user->Categories::all->lists('id')->toArray() )



$category_id = $user->Categories::all->lists('id')->toArray();
Article::whereIn('id', function($query) use ($category_id){
   $query->select('categories_id')
     ->from(with(new Category)->getTable())
     ->whereIn('category_id', $categoryID )
})->get();