Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 28.12.2019 14:02:47

Laravel запросы к базе данных

Всем привет , требуется помощь в виде небольшой консультации.
  Имеется корзина покупателя . Мне необхоимо на сайте отразить количество товара в корзине , а также их общую стоимость . В таблице корзина покупателя имеется только поле количество . Цену товара я беру из таблицы продукты . Вот здесь и столкнулся с небольшой проблемой . Сумму количества получаю таким образом.

  $view->with('shopping_cart',Shoppingcart::where('cart_id',$cart_id)->sum('quantity'));

Но для того , чтобы получить сумму количества и их общую стоимость , мне нужно джойнить таблицу продукты . И вот тут начались извращения. smile
   Чисто в Laravel мне сделать не получилось . Сделал запрос в MySQL . Вот текст запроса.

SELECT SUM(shoppingcarts.quantity) as sum_quantity ,
  SUM(shoppingcarts.quantity*products.price) as sum_total
  FROM shoppingcarts 
  LEFT JOIN products 
  ON shoppingcarts.product_id=products.id
  WHERE cart_id='8EVyZSpqPV2ikZPVpUW5idMsih6stBupp04x5xtg';

  Теперь собственно вопрос . Кто и как делает ? Или мне создавать хранимую процедуру и в Laravel обращаться непосредсвенно к ней , или все таки есть способ это сделать в Laravel средствами Eloquent ORM ?
  Надеюсь на адекватные и содержательные советы. Всем заранее спасибо .

Не в сети

#2 01.01.2020 09:21:00

Re: Laravel запросы к базе данных

Ну так "сырые выражения" же

https://laravel.ru/docs/v5/queries#%D1% … 1%8B%D0%B5

Не в сети

#3 01.01.2020 11:55:59

Re: Laravel запросы к базе данных

Во-первых, почему ты используешь left join здесь? Открытое левое или правое соединение подразумевает, что одна из половинок может отсутствовать. Ты думаешь это допустимо, когда товар не найден по его идентификатору? Не думаю! Поэтому здесь уместен только inner join, он же просто join.

Есть подозрение, что тебе надо не итоговую сумму (не только её), но стоимость каждой позиции в корзине, т.е. нужен GROUP BY product_id. Но это только подозрение.

Мой вариант цепочки на Eloquent:

Shoppingcart::select(
  DB::raw('SUM(shoppingcarts.quantity) as sum_quantity'),
  DB::raw('SUM(shoppingcarts.quantity*products.price) as sum_total')
  )
  ->join('products', 'shoppingcarts.product_id', '=', 'products.id')
  ->where('cart_id',$cart_id)

There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 03.01.2020 09:26:28

Re: Laravel запросы к базе данных

Ну так "сырые выражения" же https://laravel.ru/docs/v5/queries#%D1% … 1%8B%D0%B5

  Спасибо за ответ . я это уже читал , поэтому и спрашивал , не криво ли это , и использует ли кто нибудь это в своих программах. smile
Я например сделал немного по-другому . Создал на сервере MySQL views сделал там необходимый мне запрос и из laravel обратился к views как к таблице.

Не в сети

#5 03.01.2020 09:33:38

Re: Laravel запросы к базе данных

Во-первых, почему ты используешь left join здесь?

  Огромнейшее спасибо за Ваш отклик , но вопрос был скорее не по джойнам . Просто как то решил перестраховываться и использовать конкретное соединение left или right . smile
  Что касается моего вопроса , то я уже написал выше по поводу создания views на сервере . Посмотрел Ваше предложение . Теперь возник другой вопрос , а что использовать лучше , мой метод с views или Ваш метод. Имеется конечно ввиду с точки безопасности и скорости выполнения.
P.S Замечание по поводу inner join занес в копилочку , буду иметь ввиду. smile

Не в сети

#6 03.01.2020 13:56:37

Re: Laravel запросы к базе данных

Теперь возник другой вопрос , а что использовать лучше , мой метод с views или Ваш метод. Имеется конечно ввиду с точки безопасности и скорости выполнения.

VIEW это механизм, встроенный в СУБД. Соответственно, он более безопасный и быстрый (в общем случае, т.к. MySQL не может оптимизировать сложные запросы к VIEW). Но из этого следует и то, что если хочется переносимости между разными СУБД - VIEW лучше не использовать. С простым WHERE куда больше шансов, что он заработает в PostgresSQL или в SQLite.

Вообще, в среднем проекте нет причин использовать VIEW. Обычно "проще" значит "лучше".

Не в сети

#7 04.01.2020 00:51:46

Re: Laravel запросы к базе данных

С простым WHERE куда больше шансов, что он заработает в PostgresSQL или в SQLite.

Коротко и ясно .Спасибо за ответ. smile

Не в сети

#8 04.01.2020 14:59:07

Re: Laravel запросы к базе данных

Спасибо за ответ . я это уже читал , поэтому и спрашивал , не криво ли это , и использует ли кто нибудь это в своих программах.

Смотри: в конечном итоге илокент все равно преобразуется к SQL-запросу

вот тебе и ответ smile

Не в сети

Подвал раздела