Cakephp 2.0 - Как получить все рецепты с использованием определенного ингредиента? - PullRequest
0 голосов
/ 27 марта 2012

У меня есть 2 модели, которые связаны через ассоциацию HABTM, точно так же, как рецепты и ингредиенты связаны в кулинарной книге.

Мне нужно сделать эквивалент поиска всех рецептов, которые используют определенный ингредиент- как мне это сделать?

Итак, у меня будет ингридиент_id, и я хочу сделать что-то вроде:

$this->Recipe->find('all', array('conditions' => 'recipe uses this ingredient'));

Я также хотел бы получить список всехингредиенты, которые используются по крайней мере в одном рецепте - кто-нибудь может мне помочь с этим?

Спасибо за любую помощь, которую вы можете дать - даже ссылки на вещи, которые я могу прочитать, которые объясняют, что это было бы очень полезно.

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

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

Итак, по модели Ингредиент:

function getRecipesFromIngredients($ingredient_ids) {
  // IngredientsRecipe is the automatically created model
  // Use what you defined in the 'with' key on your HABTM 
  // definition if you defined a 'with' key
  $results = $this->IngredientsRecipe->find('all', array(
    'conditions' => array(
      'ingredient_id' => $ingredient_ids
    ),
  ));
  return Set::extract('/IngredientsRecipe/recipe_id', $results);
}

Это становится очень проверяемой, многократно используемой функцией.

Затем в рецепте контроллера:

// would pull all recipes that have ingredients 1 and 2
$recipes = $this->Recipe->find('all', array(
  'conditions' => array(
    'id' => $this->Recipe->Ingredient->getRecipesFromIngredients(array(1,2))
  )
));
1 голос
/ 27 марта 2012

Когда вы используете отношения HABTM (hasAndBelongsToMany) в CakePHP, он создает модель, комбинируя имена обеих моделей в алфавитном порядке ( ссылка ).Вы можете использовать эту модель для выполнения вашего запроса.

Пример:

<?php

$recipes = $this->Recipe->IngredientsRecipe->find('all', array(
    'conditions' => array(
        'IngredientsRecipe.ingredient_id' => 1 // This could also be an array of ingredients
    ),
    'group' => array('Recipe.id')
));

В приведенном выше примере мы используем модель IngredientsRecipe, которая имеет 2 взаимосвязи,belongsTo с ингредиентом и рецептом.На случай, если в рецепте есть несколько совпадающих ингредиентов, мы также группируем по идентификатору рецепта.

PS: Вам не нужно определять отношение к IngredientsRecipe, пока выопределили отношение hasAndBelongsToMany между рецептом и ингредиентами.CakePHP сделает все остальное автоматически.

...