Объединение запросов Laravel и подсчет

#php #laravel

#php #laravel

Вопрос:

Я пытаюсь повторить следующий SQL-запрос в контроллер laravel, но безуспешно. Запрос отлично работает как прямой запрос mysql, поэтому есть проблема с данными, но сложность ставит меня в тупик с помощью laravel query builder. Я пытался использовать функцию ‘Raw()’ и переменную в контроллере, но это все еще не возвращает данные из запроса. Любая помощь приветствуется.

 SELECT * 
 FROM (SELECT * from figures 
) t2
  left join 
( SELECT
    figure_id, 
    SUM(IF(trade='1', trade, 0)) as trades,
    SUM(IF(sale='1', sale, 0)) as sales
FROM userfigures
GROUP BY figure_id ) t1
ON (t1.figure_id = t2.id)
  

исходная команда

     $sql = "SELECT * FROM (SELECT * from figures) t2 left join ( SELECT figure_id, SUM(IF(trade='1', trade, 0)) as trades, SUM(IF(sale='1', sale, 0)) as sales FROM userfigures GROUP BY figure_id ) t1 ON (t1.figure_id = t2.id)";
   $sellers = userfigures::Raw($sql)->get();
  

Ответ №1:

попробуйте:

 DB::table('figures as t1')
  ->leftJoin(DB::table('userfigures as t2')
  ->select('figure_id',
           DB::raw("SUM(IF(trade = '1', trade, 0)) AS trades"), 
           DB::raw("SUM(IF(sale = '1', sale, 0)) AS sales")
  )
  ->groupBy('figure_id'), 't1.figure_id', 't2.id')
  ->get();

  

Комментарии:

1. Спасибо за предложение, попробовал код, и я получаю следующую ошибку, от которой я не могу избавиться после небольшой переделки. «Не удалось преобразовать объект класса Illuminate Database Query Builder в строку» У вас есть какие-либо предложения?

2. Я нашел решение, но хотел бы изучить решение выше, поскольку это современный способ выполнить запрос alirezadp10.

Ответ №2:

Используйте DB::select вместо userfigures::Raw https://laravel.com/docs/7.x/database#running-queries

Комментарии:

1. Я работаю с помощью этого метода, поскольку хочу изучить оба метода, изначально с приведенным выше кодом я получаю сообщение об ошибке: «Столбец не найден: 1054 неизвестных столбца». Я обновил код до « $ sellers = DB::select ($ sql)-> get(); « Я получаю ошибку intellisense: ожидаемый тип ‘object’. Найден ‘массив’. в VSCode и «Вызов функции-члена get() для массива» в браузере. Я пробовал «$ sellers2 = (array) $ sellers;» под строкой выше, но получаю вывод запроса в представление. (Я чувствую себя виноватым, задавая здесь вопросы, и не хочу выглядеть так, будто я просто хочу получить ответ!)

2. У меня это работает, по какой-то причине первое слово «ВЫБРАТЬ», написанное заглавными буквами, вызывало ошибку, изменил его на нижний регистр, это сработало! а затем изменил его на верхний регистр. Очень случайно (подозреваю, что это был я в некотором роде) Ваш код — это решение. Большое спасибо.

3. Это код, который работает для этого типа запросов: code $sellers1 = userfigures::select( 'figures.*', 'userfigures.figure_id', DB::raw('SUM(IF(trade="1", trade, 0)) as trades'), DB::raw('SUM(IF(sale="1", sale, 0)) as sales')) ->rightJoin('figures', 'figures.id', '=', 'userfigures.figure_id') // ->where('analytics.date', Carbon::today()->toDateString()) ->groupBy('figures.id', 'userfigures.figure_id') ->paginate(10); Спасибо, что помогли мне добраться до правильного кода на основе вашей справки AndreiXwe