Рубрики
Uncategorized

Более сильные подзапросы в laravel 6.0

Автор оригинала: David Wong.

Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t

Если вы всегда обращаете внимание на мою работу, вы будете знать, что я предпочитаю вкладывать больше работы в наше приложение laravel на уровне базы данных, Выполняя больше работы на уровне базы данных, мы, как правило, можем сократить количество выполняемых нами запросов к базе данных, объем памяти, используемой приложениями, и время, необходимое для обработки модели eloquent.Это может привести к некоторым очень значительным улучшениям производительности.

Хороший способ увеличить объем работы на уровне базы данных-использовать подзапросы Подзапросы позволяют выполнять вложенные запросы в другом запросе базы данных Это мощный способ получения данных вспомогательной модели без каких-либо дополнительных запросов к базе данных, когда результаты не могут быть найдены с помощью реляционных запросов.Вы также можете упорядочить по Предложению, где Подзапросы используются в операторах и других предложениях базы данных.

Во время выступления laracon US 2019 я сослался на конструктор запросов, который я использую, что облегчает нам использование подзапросов в laravel. Я отправил три PR в laravel и добавил их в ядро laravel

Резюме:

Подзапрос “Выбрать”

Запрос на извлечение #29567 select() и addSelect() Методы построителя запросов поддерживают подзапросы

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

В laravel 6.0 используются новые функции подзапросов, такие как запрос всех пунктов назначения пунктов назначения и информации о последнем рейсе в каждый пункт назначения имя , мы можем использовать одну инструкцию для запроса следующим образом:

return Destination::addSelect(['last_flight' => Flight::select('name')
    ->whereColumn('destination_id', 'destinations.id')
    ->orderBy('arrived_at', 'desc')
    ->limit(1)
])->get();

Обратите внимание, как вы используете eloquent для создания подзапросов. Этот вид грамматики лучше и более интуитивно понятен. Аналогично, вы можете использовать конструктор запросов:

return Destination::addSelect(['last_flight' => function ($query) {
    $query->select('name')
        ->from('flights')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1);
}])->get();

Подзапрос “Заказать по”

Кроме того, запрос на вытягивание позволяет нам запрашивать метод OrderBy () . Продолжая наш пример выше, мы можем отсортировать пункты назначения в соответствии со временем прибытия последнего рейса.

return Destination::orderByDesc(
    Flight::select('arrived_at')
        ->whereColumn('destination_id', 'destinations.id')
        ->orderBy('arrived_at', 'desc')
        ->limit(1)
)->get();

Как и в случае с выбором, вы можете использовать конструктор запросов напрямую для создания подзапросов, например, вы можете захотеть заказать на основе даты последнего входа пользователя в систему:

return User::orderBy(function ($query) {
    $query->select('created_at')
        ->from('logins')
        ->whereColumn('user_id', 'users.id')
        ->latest()
        ->limit(1);
})->get();

Подзапрос “От”

Наконец, запрос на извлечение позволяет нам из() Можно использовать подзапросы. Их иногда называют производными таблицами.

Например, вы можете рассчитать среднее общее пожертвование пользователей в приложении, однако в SQL вложенные агрегатные функции невозможны:

AVG(SUM(amount))

Вместо этого мы можем использовать подзапрос from для его вычисления:

return DB::table(function ($query) {
    $query->selectRaw('sum(amount) as total')
        ->from('donations')
        ->groupBy('user_id');
}, 'donations')->avg('total');

Возможно, вам не нужно использовать это каждый день, но когда вам это нужно, это очень важно.

Если вы находитесь в Laravel Используете вне Красноречивый , то прорывное изменение, которое необходимо заметить, – это Осветить/Базу данных/Капсулу/Менеджер На объекте таблица() Метод имеет очевидные изменения. Он был скопирован из таблицы таблица($таблица,) Изменить на таблицу таблица($таблица,,) |/。

Учить больше

Если вам интересно узнать больше о подзапросах и других передовых технологиях баз данных, пожалуйста, обязательно следите за моим блогом и смотрите мой доклад laracon US 2019.

В laracon я также выпустил новый видеокурс и работаю над моделью красноречивой производительности. Цель этого курса-научить разработчиков laravel, как перенести больше работы на уровень базы данных, чтобы значительно повысить производительность приложений laravel, при этом все еще используя красноречивый orm. Если вам интересно, обязательно присоединяйтесь к списку рассылки!