Как получить точное совпадение с несколькими предложениями where по отношению к другой таблице? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть две таблицы, items и item_values.

items    item_values
-----    -----------
id       item_id
name     value_id

Я установил связь между этими двумя таблицами в моей Item модели.

function values() {
    return $this->hasMany(ItemValues::class, "item_id", "id");
}

У меня есть массив, содержащий value_id, например, например [1, 2, 3, ...], и я хочу получить все элементы из таблицы items, если они существуют в item_values и если value_id находится в массиве выше. Я хочу, чтобы это было точное совпадение, поэтому я не хочу, чтобы он отображал все элементы с одним из значений, но я хочу, чтобы они отображали все элементы, которые имеют все значения.

$item = Items::orderBy("created_at", "desc");
if($request->has("values")) {
    $appends["values"] = $request->input("values");
    $values = $request->input("values");

    $findValues = $item->whereHas("values", function($query) use($values) {
        foreach($values as $value) {
            $query->where("value_id", $value);
        }
    });
}

$items = $item->paginate(10);

Это работает для одного значения, однако, если я попытаюсь найти несколько значений, он вернет 0 результатов.

Когда я распечатываю запрос, он возвращает:

select * from `items` where exists (select * from `item_values` where `items`.`id` = `item_values`.`item_id` and `value_id` = ? and `value_id` = ?) order by `created_at` desc

Как можно Я добиваюсь того, чего хочу?

1 Ответ

2 голосов
/ 13 марта 2020

с использованием INNER JOIN вернет только те строки из таблицы item, которые точно соответствуют item_values table

предположим, что value_id array содержит [1, 2, 3, 4 , 5] тогда необработанный запрос SQL будет выглядеть следующим образом.

SELECT items.* 
FROM items
INNER JOIN item_values on items.id = item_values.item_id
WHERE item_values.value_id IN (1, 2, 3, 4, 5)

Предложение WHERE возвращает строки элементов, имеющие значение value_id в массиве значений

позволяет преобразовать его в синтаксис Query Builder теперь

if($request->has("values")) {
    $values = $request->input("values");

    $items = Items::join('item_values', 'item_values.item_id', '=', 'items.id')
             ->whereIn('item_values.value_id', $values)->get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...