2012-03-26 1 views
0

나는 HAB ™ 협회를 통해 연결된 2 가지 모델을 가지고 있습니다. 요리법과 성분이 요리 책과 관련이있는 것과 같은 방식입니다.Cakephp 2.0 - 특정 성분을 사용하여 모든 요리법을 검색하려면 어떻게해야합니까?

특정 성분을 사용하는 모든 요리법을 찾는 것과 동일해야합니다. 어떻게해야합니까? 그래서 bascially

, 나는 ingredient_id 한 것, 내가 그런 짓을 할 :

$this->Recipe->find('all', array('conditions' => 'recipe uses this ingredient')); 
나는 또한 적어도 하나 개의 조리법에 사용되는 모든 재료의 목록을 검색하고 싶습니다

- 수 누구든지 그걸 도와 줘?

도움을 주셔서 감사합니다. 내가 읽을 수있는 내용에 대한 링크조차도 매우 도움이 될 것입니다.

답변

1

는 CakePHP의에서 (hasAndBelongsToMany) 관계, 그것은 알파벳 순서 (reference)에서 두 모델의 이름을 조합하여 모델을 생성합니다. 이 모델을 사용하여 쿼리를 수행 할 수 있습니다.

예 : 위의 예에서

<?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') 
)); 

, 우리는이 개 관계 성분과 레시피와 두 belongsTo이있는 IngredientsRecipe 모델을 사용하고 있습니다. 레시피에 일치하는 여러 성분이있는 경우 레시피 ID별로 그룹화됩니다.

추 신 : 조리법과 성분 사이에 hasAndBelongsToMany 관계를 정의한 경우 IngredientsRecipe와의 관계를 정의 할 필요가 없습니다. CakePHP는 나머지를 자동으로 처리합니다.

+0

도움에 감사드립니다. 나는 이걸 줄거야! – Sharon

+0

내가 본질적으로 내 대답과 같은 대답이기 때문에 체크 표시가이 답으로 된 이유를 모르겠다. :) – jeremyharris

+0

죄송합니다 Jeremy, 나는 정직하기 위하여, 정당한 1 개를 쟁탈했다! 나는 그것이 처음 도착했다고 생각했기 때문에 더 빠른 대답이었다. – Sharon

2

쉬운 방법은 없지만 여러 가지 방법으로 수행 할 수 있습니다. 아마도 가장 쉬운 방법은 join 테이블에서 recipe id의 목록을 가져 와서 검색하는 함수를 정의하는 것입니다.

그래서, 성분 모델 :

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); 
} 

이 매우 검증, 재사용 가능한 기능이된다. 그런 다음 조리법 컨트롤러에서

: 당신이 HABTM를 사용하는 경우

// 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)) 
) 
)); 
+0

감사합니다. 정말 도움이됩니다. – Sharon

관련 문제