2017-02-19 12 views
2

Я пытался получить помощь по этому вопросу раньше, но я думаю, что люди либо неправильно истолковывают мой вопрос, либо не совсем понимают, чего я пытаюсь достичь, с Eloquent/Laravel.Laravel поиск по отношениям

У каждого пользователя есть много категорий. В каждой категории есть много статей. Я хочу получить все статьи из набора категорий, которые пользователь имеет.

Так что пользователь имеет категории 1, категории 2, я хочу, чтобы извлечь все статьи из категории 1 и категории 2.

Для каждого из этих belongsToMany отношений ниже, у меня есть свои собственные сводные таблицы.

артикул:

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 через, но, насколько я могу судить, он не работает со многими и многими отношениями.

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

Просто интересно, почему вы делаете себя: находите? Вместо того, чтобы вводить экземпляр модели пользователя? –

ответ

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

Im путается с где должно быть в category_table.id_user. У меня есть свои категории в таблице, называемой категориями, каждая из которых имеет идентификатор. У меня есть все мои статьи в журналах, каждый из которых имеет идентификатор. должно быть '-> где ('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

Производит то же/более длительное время загрузки. Я использую это. 'public function getUserArticles() { $ user = \ App \ UserDetails :: с ('categories.articles') -> find ($ this-> id); foreach ($ user-> category 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(); 

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^