2015-02-09 7 views
0

Model excerptЛистинг продуктов пользователя по категориям в красноречивом

В принципе у меня есть следующие таблицы и я пытаюсь перечислить для данного пользователя всех своих продуктов по категориям.

Пример:

{ 
user_id: 1 
username: xpto 
    categories: [{ 
     id: 1 
     name: category_1 
     products: [{ 
      id: 3 
      name: prod1 
     }, 
     { 
      id: 3 
      name: prod1 
     }], 
     id: 2 
     name: category_2 
     products: [{ 
      id: 6 
      name: prod5 
     }], 
    }] 
} 

Ближайший я получил от моего желаемого результата был с этим запросом: App\User::with('products.category')->find(1);

уже потратили много часов, думая об этом, но не ключ, начиная отчаиваться , Помоги пожалуйста.

+0

Что именно не работает? Предоставляет ли запрос, который вы предоставили (App \ User), данные? – Dave

+0

@Dave возвращает данные, но не данные, которые я хочу (и в формате, который я хочу). Поэтому в принципе я не знаю, как написать запрос. –

ответ

0

Eloquent не использует один запрос с объединениями для возврата данных, что делает его плохим выбором, когда вам нужно фильтровать связанные таблицы. Ваш отзывчивый контакт:

App\User::with('products.category')->find(1); 

... на самом деле выполняет несколько запросов.

SELECT * FROM users WHERE id = 1 

SELECT * FROM products JOIN product_user ... WHERE user_id = 1 

SELECT * FROM categories WHERE id IN (...all of the category_ids returned from products...) 

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

Есть два способа решения этого:

  1. Использование Eloquent для извлечения пользователей с продуктами и категориями (как в примере, вы предоставляете), затем перебор результатов и вытащить (и вид) категорий и продуктов.
  2. Построить правильный запрос, используя соединения.

    User::select('users.name as user_name', 'products.name as product_name', 'categories.name as category_name') 
         ->join('product_user', 'users.id', '=', 'product_user.user_id') 
         ->join('products', 'product_user.product_id', '=', 'products.id') 
         ->join('categories', 'products.category_id', '=', 'categories.id') 
         ->orderBy('categories.name') 
         ->get(); 
    

Обратите внимание, что вам необходимо указать псевдонимы столбцов, если ваши таблицы разделяют имена столбцов, как идентификатор, имя и т.д.

+0

Спасибо за понимание. Будут работать над вами, чтобы получить то, что я ищу (довольно близко) :) –

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