2017-02-11 10 views
-1

Каждая статья относится ко многим категориям. У каждого пользователя есть много категорий. Я хочу получить все статьи, в которых есть категории пользователей. Для каждого из этих отношений ниже у меня есть своя сводная таблица.Отношения HasManyThrough with Many to Many

article_cat

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

Я попытался насколько мне известно, использовать HasMany, но он не работает со многими и многими отношениями.

В настоящее время (как своего рода «работа вокруг») Я использовал это. Ive придвинул список категорий пользователя и поиск по всем идентификаторам и вытягивать соответствующую статью и формирование коллекции из него в 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; 

Однако я не думаю, что это будет хорошо масштабироваться с ростом данных (его уже производят более 1 тыс. запросов с 1000 статьями, загрузка которых занимает 8 секунд).

Любые идеи?

+0

Дальнейшая помощь в этом вопросе? Следующий ответ не помог – user5067291

ответ

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

Возможно, я здесь глуп, но $ user-> Categories :: all возвращает ошибку Неправильного доступа к статическому методу. Также whereIn Method не найден в статье – user5067291