Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет , требуется помощь в виде небольшой консультации.
Имеется корзина покупателя . Мне необхоимо на сайте отразить количество товара в корзине , а также их общую стоимость . В таблице корзина покупателя имеется только поле количество . Цену товара я беру из таблицы продукты . Вот здесь и столкнулся с небольшой проблемой . Сумму количества получаю таким образом.
$view->with('shopping_cart',Shoppingcart::where('cart_id',$cart_id)->sum('quantity'));
Но для того , чтобы получить сумму количества и их общую стоимость , мне нужно джойнить таблицу продукты . И вот тут начались извращения.
Чисто в 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 ?
Надеюсь на адекватные и содержательные советы. Всем заранее спасибо .
Не в сети
Ну так "сырые выражения" же
Не в сети
Во-первых, почему ты используешь 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.
Не в сети
Ну так "сырые выражения" же https://laravel.ru/docs/v5/queries#%D1% … 1%8B%D0%B5
Спасибо за ответ . я это уже читал , поэтому и спрашивал , не криво ли это , и использует ли кто нибудь это в своих программах.
Я например сделал немного по-другому . Создал на сервере MySQL views сделал там необходимый мне запрос и из laravel обратился к views как к таблице.
Не в сети
Во-первых, почему ты используешь left join здесь?
Огромнейшее спасибо за Ваш отклик , но вопрос был скорее не по джойнам . Просто как то решил перестраховываться и использовать конкретное соединение left или right .
Что касается моего вопроса , то я уже написал выше по поводу создания views на сервере . Посмотрел Ваше предложение . Теперь возник другой вопрос , а что использовать лучше , мой метод с views или Ваш метод. Имеется конечно ввиду с точки безопасности и скорости выполнения.
P.S Замечание по поводу inner join занес в копилочку , буду иметь ввиду.
Не в сети
Теперь возник другой вопрос , а что использовать лучше , мой метод с views или Ваш метод. Имеется конечно ввиду с точки безопасности и скорости выполнения.
VIEW это механизм, встроенный в СУБД. Соответственно, он более безопасный и быстрый (в общем случае, т.к. MySQL не может оптимизировать сложные запросы к VIEW). Но из этого следует и то, что если хочется переносимости между разными СУБД - VIEW лучше не использовать. С простым WHERE куда больше шансов, что он заработает в PostgresSQL или в SQLite.
Вообще, в среднем проекте нет причин использовать VIEW. Обычно "проще" значит "лучше".
Не в сети
С простым WHERE куда больше шансов, что он заработает в PostgresSQL или в SQLite.
Коротко и ясно .Спасибо за ответ.
Не в сети
Спасибо за ответ . я это уже читал , поэтому и спрашивал , не криво ли это , и использует ли кто нибудь это в своих программах.
Смотри: в конечном итоге илокент все равно преобразуется к SQL-запросу
вот тебе и ответ
Не в сети
Страницы 1