2010-10-27 1 views
1

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

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

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

recipe_id
ingredient_id
amount
measurement_unit

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

ответ

4

HABTM, в ОРМ Cake, является на самом деле абстракция следующих двух модели объединения структур (используя пример):

Recipe 
-> hasMany IngredientsRecipe 
      -> belongsTo Ingredient 

и

Ingredient 
-> hasMany IngredientsRecipe 
      -> belongsTo Recipe 

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

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

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

+0

Извините, я думаю, что полностью потерял во всем этом. Как явным образом определяю две структуры связей? Создав файл php модели, точно так же, как файлы для ингредиентов и рецептов? – Olga

+1

Извините, что так долго возвращаюсь к вам. В принципе, вам нужно определить три модели вместо двух, потому что вы действительно не присоединяетесь к «Рецепту» и «Ингредиент» непосредственно вместе. Скорее, вы присоединяетесь к 'Рецепту' к' РецептуElement' к 'Ингредиенту'; и 'Ингредиент' в' РецептElement' в 'Рецепт'. «Ингредиент» и «Рецепт» продолжают выполнять ту же роль, что и сейчас, а «РецептElement» содержит информацию о конкретных измерениях и единицах для каждого ингредиента в рецепте. Я надеюсь, что в этом есть смысл. –

+0

В качестве объяснения я добавил ответ, но я сделал свою шляпу Даниэлю;) – Leo

2

Думай об этом, как это, то относиться к нему один кусок за один раз:

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

В то время как вы делаете это, забыть о HABTM и думать, а о hasMany и belongsTo

Кстати, вы не обязаны называть модели IngredientsRecipe, то есть просто по умолчанию/условность.

Когда вы закончите, относитесь к нему как hasMany, принадлежит или HABTM, если необходимо.

+0

Большое спасибо, я начну работать над этим – Olga