Laravel по-русски

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

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

#1 14.06.2021 14:49:27

kodzero
Откуда: San Francisco
Сообщений: 21
Сайт

Cложный запрос через Eloquent, для получения объекта на выходе.

Всем привет, начал с Ларыкастс, но там не подсказали, пока молчат, может кто знает.
Стоит задача перевести в Илокент относительно не простой запрос.
Возможно я не владею терминологией в данном направлении, но попробую описать суть.
Если в сыром виде формируется два запроса, для получения конечной выдачи.
1) Делается join не важно, какой, чтобы получить "виртуальную таблицу" под названием catalog
2) Далее следующим запросом работаем с этой таблицей катало, чтобы получить отсортированную выборку с агрегирующими функциями, Group by и Group concat и т.п.

SELECT catalog.name AS name, MIN(catalog.sett_price) AS sett_price, MIN(catalog.pid) AS `pid`, catalog.title as title, catalog.description as description, catalog.cuts as cuts, substring_index(GROUP_CONCAT(catalog.friendly), ',', 1) as friendly, catalog.images as images, COUNT(DISTINCT catalog.weight) AS variations
    FROM
    ( SELECT shop_additional.name as name, ROUND((shop.shank_price * 0.67 + shop_additional.melee_price) * 1.6) AS sett_price, shop_additional.pid as `pid`, shop_additional.option as weight, shop.title, shop.description, shop.cuts, shop_additional.friendly, shop.images
    FROM shop_additional
    INNER JOIN shop ON shop_additional.name = shop.name
    WHERE   shop.name=shop_additional.name AND
            shop_additional.statusc = 1 AND shop.status = 1 AND
            concat(shop.name, shop.title, shop.description) LIKE '%' ) catalog
    GROUP BY catalog.name;

Суть в том, что я не могу понять, как создать эту "виртуальную таблицу" - catalog через Eloquent, чтобы далее через эти же методы Илокент продолжить к ней применять эти правила Group by и Group concat и т.п.

Заранее всем спасибо за участие в данном вопросе.

Не в сети

#2 14.06.2021 16:09:10

Re: Cложный запрос через Eloquent, для получения объекта на выходе.

Можешь гуглить со словом "subquery". Например вот такое находится:
https://laravel.io/forum/12-23-2015-sub … ry-builder
Типа

$query1 = DB::table(DB::raw('(' . $query1->toSql() . ')  as tab1'))...

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

Не в сети

#3 14.06.2021 17:18:25

kodzero
Откуда: San Francisco
Сообщений: 21
Сайт

Re: Cложный запрос через Eloquent, для получения объекта на выходе.

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

Не в сети

#4 15.06.2021 14:01:04

kodzero
Откуда: San Francisco
Сообщений: 21
Сайт

Re: Cложный запрос через Eloquent, для получения объекта на выходе.

Может кому-то пригодиться.
В моем случае ключевой запрос должен был примерно звучать так: "eloquent from subquery", не нашел, что-бы кто-то этот вопрос таки решил через Илокент или Билдер в такой схеме, только безуспешные попытки, данного подслучая - https://laracasts.com/discuss/channels/ … g-eloquent, есть еще подход через функции замыкания, но изучить и вникнуть пока не успел, решил пойти другой дорогой.
Поэтому пока остаюсь на сыром запросе через DB и в моем случае и скорее всего в Вашем, если Вы с таким столкнулись правильнее решать проблему через проектирование базы данных, а именно такие сложные запросы - это как правило не правильно проектирование таблиц базы данных на старте под задачу бизнеса, где не соблюдено, хотя бы одно из 3 основных правила: атомарность ячеек, уникальность строк и масштабируемость - ее расширяемость, через ссылки первичного или составного ключа на вторичный ключ родительских таблиц. В конкретном данном случае сложны запрос появился, потому что карточки товаров собираются запросом из их вариаций, а не наоборот, где они были бы родительской таблицей. Так должно было быть спроектировано на старте, что в карточке товара, должны быть ее вариации, а не все свалено в одну кучу, ну или предположим, рейсы самолетов, а под ними билеты, а не так что мы собираем рейсы самолетов из  соединенных таблиц билетов и т.п. Правильнее переделать таблицу, а потом запросы.

https://www.youtube.com/watch?v=3TJfR1Ta4GU - Eloquent VS Builder DB VS SQL DB
VS - вёрсес - в переводе с английского против.
Вот тут отличное сравнение подходов по скорости, но без их возможностей функционала (имейте ввиду, что по логике актвированная пагинация у больших объектов  увеличит скорость у Илокент и Билдер запросов, но лично не проверял, если будет опыт, можете добавить в тему свои замеры):
1) Eloquent(Красноречивых - выразительных) запросов к базе данных
2) Билдеров(строителей - DB)
3) Подход через сырые запросы - тут не забываем про защиту от SQL инъекций.

Всем удачи.))

Изменено kodzero (15.06.2021 14:15:59)

Не в сети

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