Задать вопрос
@user-579

Составить запрос на Laravel Query Builder?

Добрый день уважаемые.

Всю голову сломал, не могу составить нижеуказанный запрос на Laravel Query Builder.

Помогите пожалуйста.

SELECT products.title, products.price, x.sales  
 
FROM products 
			  
			INNER JOIN 
					  (
						SELECT product_id, 
						
						MAX(sales) AS sales 
						
						FROM offers 
						
							GROUP BY product_id 
						
					  ) x
					  
			ON x.product_id = products.id 
					  
			  
ORDER BY x.sales DESC LIMIT 20


Пробовал так :

$populars = DB::table('products')

    /* ->select(DB::raw(' JOIN (SELECT product_id, MAX(sales) AS sales FROM offers GROUP BY product_id) ON offers.product_id = products.id  ')) */

    ->select( DB::table('offers')
                  ->join('offers.product_id', '=', 'products.id')
                  ->select('product_id')
                  ->max('sales')
                  ->groupBy('offers.product_id')
                  ->get()
            )
    ->orderBy('offers.sales', 'desc')
    ->take(20)
    ->get();


но выдаёт ошибку :

SQLSTATE[42000]: Syntax error or access violation: 1049 Unknown database 'offers' (SQL: select max(`sales`) as aggregate from `offers` inner join `offers`.`product_id` on `=` = `products`.`id`)
  • Вопрос задан
  • 471 просмотр
Подписаться Простой 3 комментария
Решения вопроса 1
@user-579 Автор вопроса
Благодарю Вас.

Я неправильно написал про работу коллекций в модели.

вот решение :

$populars = DB::table('products')
      ->join('offers', 'products.id', '=', 'offers.product_id')
      ->orderBy('offers.sales', 'desc')
      ->get()
      /*   */
      ->unique('title')
      ->take(20);

    return $populars;


Это гибридное решение, конструктор запросов и коллекции, теперь надо только на конструкторе запросов : )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
hOtRush
@hOtRush
$results = DB::select( DB::raw("SELECT products.title, products.price, x.sales  
 
FROM products 
        
      INNER JOIN 
            (
            SELECT product_id, 
            
            MAX(sales) AS sales 
            
            FROM offers 
            
              GROUP BY product_id 
            
            ) x
            
      ON x.product_id = products.id 
            
        
ORDER BY x.sales DESC LIMIT 20") );


Зачем сильно заморачиваться если не нужна коллекция моделей, а просто три поля.
Ответ написан
@grishinmagic
у тебя ошибка в синтаксисе join'a, попробуй так:
->join('products', 'offers.product_id', '=', 'products.id')

если что, вот ссылка на то место в доке, которое тебе нужно
https://laravel.com/docs/5.8/queries#joins
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы