Красноречивое соединение с фильтром "где не в массиве" - PullRequest
1 голос
/ 18 июня 2020

Хорошо ..

У меня есть квест "может быть, простой". У меня есть модель рецепта с отношением toMany к модели ингредиентов и модели тегов ..

Мне нужен способ отфильтровать рецепты с тегом c (здесь нет проблем) .. и я также хотите отфильтровать (исключить) рецепты, в которых есть определенные c ингредиенты ..

$recipe = Recipe::whereHas('tags', function ($q) use ($tagId, $maxCal) {
    $q->where('tag_key', $tagId);
})
->whereDoesntHave('ingredients', function ($q) use ($excludeIngredientGroups) {
    $q->whereNotIn('ingredient_group_key', $excludeIngredientGroups);
})

$ excludeIngredientGroups - это массив.

sql ошибка ..: ингредиент в неизвестном столбце .ingredient_group_key 'в' where clause '

class Recipe extends Base
{
    protected $table = "recipes";

    public function ingredients()
    {
        return $this->hasMany('App\Models\RecipeIngredient', 'recipe_id', 'id')
    }


class RecipeIngredient extends Base
{
    protected $table = "recipes_ingredients";

    public function ingredient(){
        return $this->belongsTo('App\Models\Ingredient', 'ingredient_key', 'key');
    }
    public function recipe(){
        return $this->belongsTo("\App\Models\Recipe","recipe_id","id");
    }

имеет ли это смысл?

1 Ответ

1 голос
/ 18 июня 2020

я думаю, что ваши отношения в модели рецепта должны быть:

1- ингридиенты: модель ингредиента принадлежитToMany

2- recipeIngredients hasMany модель рецептаIngredient

class Recipe extends Base
{
    protected $table = "recipes";

    public function ingredients()
    {
        return $this->belongsToMany('App\Models\Ingredient', 'recipes_ingredients','recipe_id','ingredient_key');
    }
public function recipeIngredients()
    {
        return $this->hasMany('App\Models\RecipeIngredient', 'recipe_id', 'id');
    }
}

еще одно примечание:

-> whereDoesntHave ('ингредиенты', функция ($ q) use ($ excludeIngredientGroups) {$ q-> whereNotIn ('ингридиент_группы_кей', $ excludeIngredientGroups);})

whereNotIn shoud be: whereIn, поскольку вы используете whereDoesntHave

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...