2016-01-20 2 views
3

Я пытаюсь запустить этот запрос:Как я могу использовать whereHas в отношении к той же таблице с Eloquent Query Builder?

$products = $this->product_model->where(function($query) use ($key) { 
    $query->whereHas('categories', function ($category) use ($key) { 
     $category->where('key', $key); 
    }); 
    $query->orWhereHas('parent.categories', function ($category) use ($key) { 
     return $category->where('key', $key); 
    }); 
}); 

Родительское отношение это еще один продукт, так что это из той же таблицы. Проблема у меня в запросе, что это производит:

SELECT * 
FROM `products` 
WHERE (
    (SELECT count(*) 
    FROM `categories` 
    INNER JOIN `category_product` ON `categories`.`id` = `category_product`.`category_id` 
    WHERE `category_product`.`product_id` = `products`.`id` 
    AND `key` = 'mens' 
    ) >= 1 
OR 
    (SELECT count(*) 
    FROM `products` AS `self_30ec5d4782a83841add518f618b9f59e` 
    WHERE `self_30ec5d4782a83841add518f618b9f59e`.`id` = `products`.`parent_product_id` 
    AND 
     (SELECT count(*) 
      FROM `categories` 
      INNER JOIN `category_product` ON `categories`.`id` = `category_product`.`category_id` 
      WHERE `category_product`.`product_id` = `products`.`id` 
      AND `key` = 'mens' 
     ) >= 1 
    ) >= 1 
) 

В подзапроса после OR мне эта строка:

WHERE `category_product`.`product_id` = `products`.`id` 

таким:

WHERE `category_product`.`product_id` = `self_30ec5d4782a83841add518f618b9f59e`.`id` 

Когда я запускаю этот SQL в базе данных, я получаю правильный результат:

SELECT * 
FROM `products` 
WHERE (
    (SELECT count(*) 
    FROM `categories` 
    INNER JOIN `category_product` ON `categories`.`id` = `category_product`.`category_id` 
    WHERE `category_product`.`product_id` = `products`.`id` 
    AND `key` = 'mens' 
    ) >= 1 
OR 
    (SELECT count(*) 
    FROM `products` AS `self_30ec5d4782a83841add518f618b9f59e` 
    WHERE `self_30ec5d4782a83841add518f618b9f59e`.`id` = `products`.`parent_product_id` 
    AND 
     (SELECT count(*) 
      FROM `categories` 
      INNER JOIN `category_product` ON `categories`.`id` = `category_product`.`category_id` 
      WHERE `category_product`.`product_id` = `self_30ec5d4782a83841add518f618b9f59e`.`id` 
      AND `key` = 'mens' 
     ) >= 1 
    ) >= 1 
) 

Но я не уверен, как это сделать в моем PHP-коде. Кроме того, является ли это предполагаемым выходом SQL? Разве это не должно делать то, что я хочу? Так как суб-запрос находится внутри whereHas?

ответ

1

Это ошибка в Ларавеле. has()/whereHas() не справляется с условиями на самостоятельные отношения или вложенными собственными отношениями.

Я отправил запрос на перенос, чтобы исправить эту проблему. Вы можете посмотреть его here.

Я не знаю, будет ли он принят, но вы можете взглянуть на него, чтобы увидеть измененный код, и принять решение о том, хотите ли вы вручную обновить Laravel самостоятельно или нет. Вы также можете следить за ним и ждать, чтобы увидеть результат.

+0

Спасибо, я начал думать, что это может быть ошибка, но у меня не было времени (или, возможно, способности!), Чтобы исследовать его дальше. –

Смежные вопросы