Получение данных из БД через join
Пытаюсь вывести из БД записи через join, но почему-то срабатывает только на один параметр в массиве, если больше, то не выдает ничего.
$data->join("property_product", function ($join) use ($filter) {
$join->on("product.id", "=", "property_product.id_product");
foreach ($filter['property'] as $keyp => $valuep) {
$join->where("property_product.id_property", "=", $valuep['id_property']);
}
});
По записям в БД все есть, все должно работать. Если я делаю без foreach
$join->where("property_product.id_property", "=", $filter['property'][0]['id_property']);
или
$join->where("property_product.id_property", "=", $filter['property'][1]['id_property']);
то все работает. То есть принимает только один where, со вторым уже ничего не работает.
$filter['property'] = [["id_property" => 2], ["id_property" => 3]]
property_product
| id | id_product | id_property |
|---|---|---|
| 1 | 1 | 2 |
| 1 | 1 | 3 |
product
| id | name |
|---|---|
| 1 | name 1 |
| 2 | name 2 |
| 3 | name 3 |
Ответы (3 шт):
Замените в цикле
$join->where("property_product.id_property", "=", $valuep['id_property']);
на
$join->orWhere("property_product.id_property", "=", $valuep['id_property']);
Т.к. в первом случае у вас формируется такая структура "SELECT ... FROM ... WHERE ... AND ... AND ...), во втором же будет "SELECT ... FROM ... WHERE ... OR ... OR ...)
Если правильно понял, вам необходимо реализовать так называемый фасетный поиск, то есть получить product, имеющие все перечисленные property. В этом случае на каждый property должен быть отдельный join:
foreach ($filter['property'] as $property) {
$alias = 'property_product_' . $property['id_property'];
$data->join("property_product as {$alias}", function ($join) use ($property, $alias) {
$join->on("product.id", "=", "{$alias}.id_product")
->where("{$alias}.id_property", $property['id_property']);
});
}
Если я правильно вас понимаю, в Laravel есть более удобные способы сделать нечто подобное, например:
Product::whereHas('property_product', function($query) use ($idsProperties) {
$query->whereIn('id', $idsProperties);
})->get();
Если бы вы точнее сформулировали вопрос, что вы хотите получить на выходе, ответ тоже был бы точнее..