2016-02-03 3 views
0

OP:Laravel «Трехсторонний» опорный стол?

У меня есть страница под названием «Бакалея» на моем сайте. Для этого я использую две таблицы:

Categories [$this->hasMany('App\Product')] 
- id 
- name 

Products [$this->belongsTo('App\Category')] 
- id 
- category_id 
- name 

Простой материал. В моем запросе я собираю все категории с соответствующими продуктами. groceries = Category::with('products')->get();

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

Category Alcohol 
- Beer 
- Wine 
- Whisky 

Category Bread 
- Brown Bread 
- White Bread 

.. и так далее.

И вот тогда это становится сложным, по крайней мере для меня. До сих пор я использовал вышеупомянутый метод для одного простого списка продуктов. Но теперь я хочу добавить еще одну таблицу под названием «Продовольственные товары», в которой я храню списки продуктов. Как так:

Groceries 
- id 
- name 

С этим, я думаю, что сводная таблица пригодится, но я не уверен, о том, что хранить в сводной таблице и как получить доступ ко всем данным:

category_product? 
grocery_product? 
- id 
- grocery_id 
- product_id? 
- category_id? I don't think I need to store this in the pivot table, it can be accessed through the Products model? 
- number 

Я с трудом постигать «простую» сводную таблицу, и теперь это становится еще более сложным, с «трехходовой» сводной таблицей.

Я хотел бы хранить следующие в моей сводной таблице:

Продуктовая идентификатор списка покупок. Но потом я застрял. Что еще я должен хранить в сводной таблице, для того, чтобы меня, чтобы иметь возможность по-прежнему продолжать использовать вышеупомянутый метод, но с дополнительным параметром, например, так:

$groceries = Grocery::find($id)->with('categories')->with('products'); ? 

Что лично я имею в виду, что Я should использовать следующее соотношение в моей модели Бакалея ?:

public function categories() 
{ 
    return $this->hasMany('App\Category')->with('App\Product'); 
} 

Любые указатели в правильном направлении, чтобы помочь указать свой ум в правильном направлении будет уже помочь тонн.

Edit:

Модель пользователя:

public function groceries() 
{ 
    return $this->hasMany('App\Grocery'); 
} 

Модель Категория:

public function products() 
{ 
    return $this->hasMany('App\Product'); 
} 

Model Продукты:

public function category() 
{ 
    return $this->belongsTo('App\Category'); 
} 

Модель Бакалея:

// No relations yet 

Редактировать # 2: На моей странице groceries.index У меня есть простой список списков покупок для текущего зарегистрированного пользователя. Они могут создавать, редактировать или удалять списки продуктов.

После того, как пользователь нажимает на «Создать Бакалея список», я показываю вид со всеми категориями и их соответствующих продуктов, например:

Category Alcohol 
- [ ] Beer 
- [ ] Wine 
- [ ] Whisky 

Category Bread 
- [ ] Brown Bread 
- [ ] White Bread 

[] обозначает флажком. Пользователь может выбрать, какие продукты он или она хочет добавить в список. При сохранении я хочу сохранить идентификатор списка продуктов в сводной таблице с выбранными идентификаторами продукта.

Затем в форме редактирования я хочу показать тот же вид, но с сохраненными продуктами, которые уже выбраны. Поэтому я считаю, что лучший способ добиться этого - сохранить идентификатор бакалеи в сводной таблице, и это выбранные продукты. Затем, в форме редактирования, я просто проверяю, существует ли идентификатор продукта, и если это так, установите флажок. Но я застрял в том, как отношения должны быть похожими и что я на самом деле должен хранить в сводной таблице, идентификатор продукта, как я уже сказал, или я даже не должен использовать сводную таблицу вообще?

+1

Что такое список Бакалея в вашем случае? 'User ID 1: одно вино, два пива, один сыр' - что-то вроде этого или нет? –

+0

объясняют отношение Продукта с категориями и/или продуктами. – Junaid

+0

Просьба указать отношения между категорией, бакалейными товарами и продуктом. –

ответ

1

Вот как я бы об этом:

  1. Продукт belongsTo категорию, в вашем случае.
  2. Следовательно, Категория hasMany Продукты.
  3. Пользователь hasMany «продуктовые списки», каждый из которых hasMany Продукты
  4. Так Перечне также belongsTo один конкретный пользователь
  5. Таким образом, продукт также будет belongsToMany Списки

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

Я бы предпочла Query Builder или простые необработанные DB-запросы вместо Eloquent-методов для сложных JOINs, подобных этим, поскольку построитель связей в Laravel фактически выполняет WHERE id IN (1, 2, 3), что немного хуже с точки зрения производительности по сравнению с регулярное соединение. Смотрите их для справки:

https://laravel.com/docs/5.0/queries#raw-expressions

https://laravel.com/docs/5.1/queries#joins

+1

Спасибо, хотя число 3 и 5 были вещами, о которых я не был уверен. Но теперь, когда вы так выразились, на самом деле это имеет смысл. Теперь время, чтобы попытаться обвести вокруг себя голову: D – Hardist