У меня возникло много проблем с первым изучением этого вопроса с помощью Laravel. Самое замечательное в этой проблеме - вы можете использовать миграции, чтобы что-то попробовать, и отбросить их, если это не лучший способ.
Eloquent основан на [активной схеме записи] [1], поэтому чтение активных руководств по записи будет большой помощью. Вы нацелены на [нормализацию базы данных] [2]. Мне повезло с поиском «рельсов нормализации базы данных», поскольку RoR существует уже давно и использует те же шаблоны.
Мне будет легче продолжать делать то, что вы делали изначально.
> Супермаркет имеет многоэлектронные> Производители
Производитель-> принадлежат МНОГИХ> супермаркеты
продукт-> принадлежит одно-> производитель
Производитель-> имеет многоэлектронные> продукты
Если у продукта всегда есть количество, а продукт не имеет много сумм, его обычно лучше просто положить на стол продукта. Обычно продукт должен иметь опцию_amt, retail_amt на столе.
Если у вас есть что-то вроде единицы суммы:
unit_amount table:
id | title
1 pallet
2 case
3 box
4 single
... чем можно было бы положить, что в отдельной таблице. Причина в том, что вы можете легко исправить орфографическую ошибку, добавить другую сумму только в одном месте. Если ваш разработчик опечатывает паллеты в обновленном sql, вы не получаете дубликатов записей с ошибками в таблице продуктов.
таблица продукт будет иметь unit_amount столбец, в котором хранится идентификатор так:
product table:
id | title | unit_amount
1 | water | 2
Вам нужно только сводную таблицу для многих многих отношениях. Сводная таблица позволит вам делать запросы, как это:
select * from manufacturer_product where manufacturer_id = 2
... и получить каждый продукт для производителя 2. Важно, если производитель имеет много продуктов, каждый из них новый рекорд.
manufacturer_product table:
manufacturer_id | product_id
2 | 1
2 | 8
2 | 12
Эта система отчасти разваливается, если у вас есть warehouse_id на этом столе тоже и производитель имеет 900 продуктов, но 2 склада:
manufacturer_id | product_id | warehouse_id
2 | 1 | 1
2 | 8 |
2 | 12 |
Если у вас есть куча других столбцов вы 1 .) возвращая кучу данных, которые вам не нужны 2.) больше не могут использовать красноречие отношения и 3.) что вы собираетесь назвать таблицей?
Дэйл Rees имеет удивительный путеводитель по красноречивым отношениям здесь, что было очень полезно для меня:
http://daylerees.com/codebright/eloquent-relationships
Я в принципе хочу, чтобы загрузить «ингредиенты», которые связаны с «продуктами», которые связаны к 'изготовителям
Для этого вам необходимо использовать отношения «имеет много сквозных».Это будет выглядеть следующим образом:
class Manufacturer extends eloquent {
public function products {
return $this->hasMany('Product');
}
public function ingredients {
return $this->hasManyThrough('Ingredient', 'Product'); //has many ingredients through products
}
}
Вы можете запросить отношения вроде этого:
$manufacturer = new Manufacturer;
$ingredients = $manufacturer->ingredients();
Обратное тоже работает:
class Ingredient extends eloquent {
public function products {
return $this->belongsToMany('Product');
}
public function manufacturer {
//this is actually belongToThrough but they don't call it that
return $this->hasManyThrough('Manufacturer', 'Product');
}
}
http://laravel.com/docs/4.2/eloquent#relationships
Обратное становится немного более запутанным, см. обсуждение здесь:
https://github.com/laravel/framework/issues/6161
[1] http://en.wikipedia.org/wiki/Active_record_pattern [2] http://en.wikipedia.org/wiki/Database_normalization
Спасибо большое! Это было очень полезно! Я постараюсь реализовать его и посмотреть, как далеко я смогу получить :) Было бы неплохо, если бы вы могли время от времени добывать добычу. Я пытаюсь реализовать его сейчас, но у меня все еще есть некоторые приличные большие вопросительные знаки в голове – ptrckolous