HABTM с дополнительными колонками для рецептурных ингредиентов - PullRequest
1 голос
/ 27 октября 2010

Для моего сайта по обмену рецептами я хочу создать базу данных и модели CakePHP для рецептов и их ингредиентов.

Я создал две таблицы: рецепты и ингредиенты. Третья таблица - это таблица HABTM для ингредиентов_ рецептов, в которой также хранится количество ингредиентов, необходимое для рецептов. Как мне создать модель для третьей таблицы?

Третья таблица будет выглядеть примерно так:

recipe_id<br> ingredient_id<br> amount<br> measurement_unit

Я также подумал о добавлении еще одной таблицы для measure_units для хранения всех возможных единиц (например, столовая ложка, чайная ложка, чашка и т. Д.). Это будет слишком много?

Ответы [ 2 ]

4 голосов
/ 27 октября 2010

HABTM, в ORM Cake, на самом деле является абстракцией следующих двух структур ассоциации моделей (на вашем примере):

Recipe
-> hasMany IngredientsRecipe
           -> belongsTo Ingredient

и

Ingredient
-> hasMany IngredientsRecipe
           -> belongsTo Recipe

Модель IngredientsRecipe выведена и используется только для связи двух первоклассных моделей, Ingredient и Recipe.

Однако в вашем случае вы на самом деле хотите, чтобы IngredientsRecipe была первоклассной моделью, которая нарушает абстракцию HABTM. Фактически, вам нужно явно определить две вышеупомянутые структуры ассоциаций, чтобы Cake рассматривал модель IngredientsRecipe как первоклассного гражданина, позволяя вам делать запросы к ней, сохранять записи и т. Д.

Кроме того, нет, я не думаю, что это слишком много для создания дополнительной MeasurementUnit модели. Это обеспечит вам гораздо большую гибкость.

2 голосов
/ 29 октября 2010

Думайте об этом так, а затем обрабатывайте по одному куску за раз:

`Recipe` (1)--(n) IngredientsRecipe (n)--(1) Ingredient
  1. В Recipe создайте ассоциацию для IngredientsRecipe
  2. В Ingredient создайте связь с IngredientsRecipe
  3. В IngredientsRecipe создать ассоциацию с Recipe
  4. Еще в IngredientsRecipe создайте ассоциацию с Ingredient

Пока вы это делаете, забудьте о HABTM и вместо этого подумайте о hasMany и belongsTo

Между прочим, вы не обязаны вызывать модель IngredientsRecipe, которая является просто соглашением по умолчанию.

Когда вы закончите, относитесь к нему как hasMany, ownTo или HABTM в зависимости от ситуации.

...