join в несколько уровней
Пишу фильтр для сайта, необходимо использовать join в несколько уровней, в один уровень умею, а вот второй уровень не могу написать, ошибками закидывает.
В property_product находится связка товара и характеристики.
В property находятся сами характеристики.
Задача: получить product учитывая характеристики. Сначала берем из property_product товары с характеристиками, потом отсортировываем лишние, чтобы в property были совпадения. Желательно сделать в таком же виде, чтобы был один основной join, а всё остальное внутри него. То есть получаетс join в 2 уровня.
Вот, что я наворотил :D
$product = DB::table("product")
->join('property_product', function($join) use ($filter) {
if (!empty($filter) && !empty($filter['property'])) {
$join->on('property_product.id_product', '=', 'product.id');
foreach ($filter['property'] as $keyp => $valuep) {
$join->join('property', function($joinp) use ($valuep) {
$joinp->on('property.id', '=', 'property_product.id_property')
->where('property.val', '=', $valuep['value'])
->where('property.id_category', '=', $valuep['id']);
});
}
}
});
Ошибка:
Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id_category' in where clause is ambiguous (SQL: select `product`.* from `product` inner join (`property_product` inner join `property` on `property`.`id` = `property_product`.`id_property` and `property`.`val` = 2 and `property`.`id_category` = 2) on `property_product`.`id_product` = `product`.`id` where (`id_category` = 1 and `id_city` = 1) and `id` = 1 limit 15 offset 0) in file /home/host/loc/shop/api/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 671
Ответы (1 шт):
Автор решения: Adilet Usonov
→ Ссылка
Может быть легче использовать чистый sql?
SELECT column1, column2, column3 FROM table1, table2, table3
WHERE table1.id = table2.id and table2.id = table3.id