레시피와 관련 재료에 대한 검색 기능을 구현하고 싶습니다. 사용자는 검색에서 배제하려는 재료와 동시에 그가 찾고있는 조리법에 포함 된 재료를 지정해야합니다. 내가 전화 컨트롤러에서Cakephp3.1 : 동일한 관련 모델에 대해 동시에 matching() 및 notMatching() 사용
public function findByContainingIngredients(Query $query, array $params)
{
$ingredients = preg_replace('/\s+/', '', $params['containing_ingredients']);
if($ingredients) {
$ingredients = explode(',', $ingredients);
$query->distinct(['Recipes.id']);
$query->matching('Ingredients', function ($query) use($ingredients) {
return $query->where(function ($exp, $query) use($ingredients) {
return $exp->in('Ingredients.title', $ingredients);
});
});
}
return $query;
}
public function findByExcludingIngredients(Query $query, array $params)
{
$ingredients = preg_replace('/\s+/', '', $params['excluding_ingredients']);
if($ingredients) {
$ingredients = explode(',', $ingredients);
$query->distinct(['Recipes.id']);
$query->notMatching('Ingredients', function ($query) use ($ingredients) {
return $query->where(function ($exp, $query) use ($ingredients) {
return $exp->in('Ingredients.title', $ingredients);
});
});
}
return $query;
}
:
그
내 두 줍는있는 사용자가 검색에서 성분을 제외하고 그가 포함하고 싶어 하나 개 광석 개 성분을 지정 $recipes = $this->Recipes->find()
->find('byExcludingIngredients', $this->request->data)
->find('byContainingIngredients', $this->request->data);
경우 결과가 0입니다.
SELECT
Recipes.id AS `Recipes__id`,
Recipes.title AS `Recipes__title`,
.....
FROM
recipes Recipes
INNER JOIN ingredients Ingredients ON (
Ingredients.title IN (: c0)
AND Ingredients.title IN (: c1)
AND Recipes.id = (Ingredients.recipe_id)
)
WHERE
(
Recipes.title like '%%'
AND (Ingredients.id) IS NULL
)
GROUP BY
Recipes.id,
Recipes.id
문제는 "AND (Ingredients.id가) NULL IS"내가 생성 된 SQL을 살펴 때 가 나는 문제를 참조하십시오. 이 선은 포함 된 재료의 결과를 사라지게합니다. 내 접근 방법 :
- 회 협회에 notMatching()를 호출 할 때 별칭을 만들기. 나는 이것이 Cake3.1에서는 가능하지 않다고 생각한다.
- PK/FK와 제외 된 타이틀에서 왼쪽 조인을 사용하고 별칭을 만드는 것이다. 기본적으로 내 자신의 notMatching 함수를 작성합니다. 이것은 효과가 있지만 옳은 생각은 아닙니다.
다른 해결책이 있습니까?
일치하는/notMatching 함수는 첫 번째 매개 변수가 테이블 이름이나 별칭이 아닌 assoiciation의 이름이 될 것으로 예상합니다. 슬프게도, 이것은 작동하지 않습니다. – napolin