Статья была переслана из профессионального сообщества разработчиков 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. Если вам интересно, обязательно присоединяйтесь к списку рассылки!