Eloquent ORM кажется простой, но под капотом существует много полускрытых функций и менее известных способов. В этой статье я покажу вам несколько трюков. Вместо этого: Вы можете сделать так: Так тоже будет работать: Eloquent есть несколько функций, которые объединяют два метода, например “пожалуйста, сделай X, иначе сделай Y”. Пример 1 – findOrFail(): Вместо этого: Делаем это: Пример 2 – firstOrCreate(): Вместо этого: Делаем это: В модели Eloquent есть волшебный метод boot(), где вы можете переопределить поведение по умолчанию: Вероятно, одним из наиболее популярных примеров является установка значения поля на момент создания объекта модели. Предположим, вы хотите сгенерировать поле UUID в этот момент. Это типичный способ определения отношений: Но знаете ли вы, что сюда мы можем добавить where или orderBy?
Например, если вам нужно специальное отношения для некоторых типов пользователей, упорядоченное по электронной почте, вы можете сделать это: Существует несколько «параметров» Eloquent модели в виде свойств класса. Самые популярные из них, вероятно, следующие: Но подождите, есть еще: И есть еще больше, я перечислил наиболее интересные из них, для более подробной информации ознакомьтесь с кодом по умолчанию abstract Model class и посмомотрите все используемые трэйты. Всем известен метод find (), правда? Я был удивлен, как мало кто знает о том, что он может принимать несколько IDшников в виде массива: Есть элегантный способ превратить это: В это: Да, вы можете изменить имя любого поля и добавить его как суффикс в “where”, и оно будет работать как по волшебству.
Также в Eloquent ORM есть предустановленные методы, связанные с датой и временем: Немного больше чем "трюк". Что делать если у вас есть темы форума, но вы хотите их отсортировать, по их последним постам? Довольно популярное требование в форумах с последними обновленными темами вверху, правда? Сначала опишите отдельную связь для последнего поста в теме: И после, в вашем контроллере, вы можете выполнить такую "магию": Многие из нас пишут условные запросы с «if-else», что-то вроде этого: Но лучший способ — использовать when(): Этот пример может показаться не короче или элегантнее, но правильнее будет пробрасывать параметры: Допустим, у вас есть пост, принадлежащий автору, и Blade код: Но что, если автор удален или не установлен по какой-либо причине? Вы получите ошибку на подобии "property of non-object". Конечно, вы можете предотвратить это следующим образом: Но вы можете сделать это на уровне Eloquent отношений: В этом примере отношение author() возвращает пустую модель App\Author, если автор не прикреплен к посту. Кроме того, мы можем присвоить значениям свойств по умолчанию для этой модели. Представьте что у вас есть такой преобразователь: Вам нужно отсортировать записи по полю full_name? Такое решение работать не будет: Решение довольно простое. Нам нужно отсортировать записи после того как мы их получили. Обратите внимание что название функций отличается — это не orderBy, это sortBy. Что делать, если вы хотите, чтобы User::all() всегда сортировался по полю name? Вы можете назначить глобальную заготовку (Global Scope). Вернемся к методу boot (), о котором мы уже говорили выше. Иногда нам нужно добавить сырые выражения в наш Eloquent запрос.
К счастью, для этого есть функции. Без глубоких объяснений, вот лучший способ сделать копию записи в базе данных: Не совсем о Eloquent, это скорее о коллекциях, но все же мощный метод — для обработки больших наборов данных. Вы можете разбить их на кусочки. Вместо этого: Вы можете сделать это: Мы все знаем Artisan команду: Но знаете ли вы, что есть три полезных флага для создания дополнительных файлов модели? -r указывает на то что контроллер должен быть ресурсом (resourceful) Знаете ли вы, что метод ->save() может принимать параметры? Как результат мы можем “игнорировать” updated_at функциональность, которая по умолчанию должна была установить текущую метку времени. Посмотрите на следующий пример: Здесь мы переписали updated_at нашем предустановленным значением. Вы когда-нибудь задумывались над тем, что этот код возвращает? Я имею в виду, что обновление выполняется в базе данных, но что будет содержать этот $result? Ответ: затронутые строки. Поэтому, если вам нужно проверить, сколько строк было затронуто, вам не нужно ничего вызывать — метод update() вернет это число для вас. Что делать если у вас есть AND и OR в вашем SQL запросе, как здесь: Как преобразовать этот запрос в Eloquent запрос? Это неправильный способ: Порядок будет неправильным. Правильный способ немного сложнее, используя замыкания в качестве подзапросов: Вы можете передать массив параметров в orWhere().
“Обычный” способ: Вы можете сделать это так: