- Как выбрать конкретные столбцы в laravel eloquent
- Ответы — Как выбрать конкретные столбцы в laravel eloquent / How to select specific columns in laravel eloquent
- Чтобы получить результат конкретного столбца из таблицы,мы должны указать имя столбца.
- Laravel 8 · Eloquent · Начало работы
- Введение
- Генерация классов модели
- Соглашения по именованию моделей Eloquent
- Именование таблиц
- Первичные ключи
- «Составные» первичные ключи
- Временные метки
- Соединения с БД
- Значения атрибутов по умолчанию
- Получение моделей
- Создание запросов
- Обновление моделей
- Коллекции
- Разбиение результатов
- Отложенная потоковая передача результатов
- Курсоры
- Расширенные подзапросы
- Выборка
- Сортировка
- Извлечение отдельных моделей
- Исключения при отсутствии результатов запроса
- Получение или создание моделей
- Извлечение Агрегатов
- Вставка и обновление моделей
- Вставка
- Обновление
- Массовые обновления
- Изучение изменений атрибутов
- Массовое присвоение
- Массовое присвоение и JSON-столбцы
- Защита массового присвоения
- Обновления-вставки
- Удаление моделей
- Удаление существующей модели по ее первичному ключу
- Удаление моделей через запрос
- Программное удаление
- Восстановление программно удаленных моделей
- Удаление моделей без возможности восстановления
- Запросы для моделей, использующих программное удаление
- Включение программно удаленных моделей
- Извлечение только программно удаленных моделей
- Репликация (тиражирование) моделей
- Области запроса
- Глобальные области запроса
- Написание глобальных областей запроса
- Применение глобальных областей запроса
- Анонимные глобальные области запроса
- Игнорирование глобальных областей запроса
- Локальные области запроса
- Использование локальных областей запроса
- Динамические области запроса
- Сравнение моделей
- События
- Использование замыканий
- Наблюдатели
- Определение наблюдателей
- Наблюдатели и транзакции базы данных
- Подавление событий
- Тихое сохранение одной модели
Как выбрать конкретные столбцы в laravel eloquent
допустим, у меня есть 7 столбцов в таблице, и я хочу выбрать только два из них, что-то вроде этого
В модели laravel eloquent это может выглядеть так
но я думаю, что это выражение выберет все столбцы, где id равен 1, и я хочу только два столбца(имя, фамилия). как выбрать только два столбца?
Ответы — Как выбрать конкретные столбцы в laravel eloquent / How to select specific columns in laravel eloquent
Вы можете сделать это вот так:
Вы можете использовать Table::select (‘name’, ‘surname’)->where (‘id’, 1)->get () .
Имейте в виду, что при выборе только для определенных полей вам придется сделать еще один запрос, если вы в конечном итоге получите доступ к этим другим полям позже в запросе (это может быть очевидно, просто хотелось бы включить это предостережение). Включение поля id обычно является хорошей идеей, поэтому laravel знает, как записывать любые обновления, которые вы делаете в экземпляр модели.
Кроме того, Model::all([‘id’])->toArray() он будет извлекать только идентификатор в виде массива.
Сначала вам нужно создать модель, представляющую эту таблицу, а затем использовать приведенный ниже красноречивый способ извлечения данных только из 2 полей.
Используя метод all (), мы можем выбрать определенные столбцы из таблицы, как показано ниже.
Примечание: Laravel 5.4
Вы можете использовать следующий запрос:
Также вы можете использовать pluck.
Вы можете использовать get (), а также все()
Чтобы получить результат конкретного столбца из таблицы,мы должны указать имя столбца.
Используйте следующий код : —
->get() так же, как ->all() (и ->first() и т. д.), может принимать поля, которые вы хотите вернуть в качестве параметров;
Вернул бы коллекцию, но только с column1 и column2
Вы также можете использовать find() следующим образом:
Переменная $id может быть массивом в случае, если вам нужно получить несколько экземпляров модели.
вы можете также использовать findOrFail() способ здесь это хорошо, чтобы использовать
если исключение не перехвачено, то пользователю автоматически отправляется HTTP-ответ 404. Нет необходимости писать явные проверки, чтобы вернуть 404 ответа, когда использование этих методов не дает ошибки 500..
Хотя наиболее распространенным подходом является использование Model::select , он может привести к отрисовке всех атрибутов, определенных с помощью методов доступа в классах моделей. Итак, если вы определяете атрибут в своей модели:
А потом использовать: TableName::select(‘username’)->where(‘id’, 1)->get();
Он будет выводить коллекцию как с first_name , так и с username , а не только с именем пользователя.
Лучше использовать pluck() , соло или опционально в сочетании с select — если вам нужны конкретные столбцы.
TableName::where(‘id’, 1)->pluck(‘username’); //это вернет коллекцию, состоящую только из значений username
Кроме того, при необходимости используйте 0 для преобразования объекта коллекции в массив.
Если вы хотите получить одну строку и из этой строки один столбец, код одной строки для получения значения конкретного столбца должен использовать метод find() наряду с указанием столбца, который вы хотите получить.
Вот пример кода:
Из laravel 5.3 только с помощью метода get() вы можете получить определенные столбцы вашей таблицы:
Или из laravel 5.4 вы также можете использовать метод all() для получения полей по вашему выбору:
с обоими вышеперечисленными методами get() или all() вы также можете использовать where() , но синтаксис для обоих отличается:
Модель::все()
Модель::get()
Получить значение одного столбца:
вы можете использовать этот метод с предложением where:
или используйте этот метод для обхода метода PhpStorm, если он не найден в App\Models»:
Источник
Laravel 8 · Eloquent · Начало работы
Введение
Laravel содержит библиотеку Eloquent ORM (объектно-реляционное отображение), которая позволяет с удовольствием взаимодействовать с базой данных. При использовании Eloquent каждая таблица БД имеет соответствующую «Модель», которая используется для взаимодействия с этой таблицей. Помимо получения записей из таблицы БД, модели Eloquent также позволяют вставлять, обновлять и удалять записи из таблицы.
Перед началом работы обязательно настройте соединение с БД в конфигурационном файле config/database.php . Для получения дополнительной информации о настройке БД ознакомьтесь с документацией по конфигурированию БД.
Генерация классов модели
Модели расширяют класс Illuminate\Database\Eloquent\Model . Чтобы сгенерировать новую модель Eloquent, используйте команду make:model Artisan. Эта команда поместит новый класс модели в каталог app/Models вашего приложения:
При создании модели вы можете сгенерировать миграцию БД, используя параметр —migration или -m :
При создании модели вы можете также создавать другие различные типы классов, например фабрики, наполнители и контроллеры. Кроме того, эти параметры можно комбинировать для создания сразу нескольких классов:
Соглашения по именованию моделей Eloquent
Модели, созданные командой make:model , будут помещены в каталог app/Models . Давайте рассмотрим базовый класс модели и обсудим некоторые ключевые соглашения Eloquent:
Именование таблиц
Взглянув на приведенный выше пример, вы могли заметить, что мы не сообщили Eloquent, какая таблица БД соответствует нашей модели Flight . По соглашению, в качестве имени таблицы будет использоваться имя класса в «змеином_регистре», во множественном числе, если явно не указано другое. В нашем случае, Eloquent будет предполагать, что модель Flight хранит записи в таблице flights , а модель AirTrafficController – в таблице air_traffic_controllers .
Если таблица БД вашей модели не соответствует этому соглашению, вы можете вручную указать имя таблицы модели, определив свойство table в модели:
Первичные ключи
Eloquent также предполагает, что в соответствующей таблице БД каждой модели есть столбец первичного ключа с именем id . При необходимости вы можете определить защищенное свойство $primaryKey в модели, чтобы указать другой столбец, который служит первичным ключом:
Кроме того, Eloquent предполагает, что первичный ключ является автоинкрементным целочисленным значением, что означает, что Eloquent автоматически преобразует первичный ключ в целое число. Если вы хотите использовать неинкрементный или нечисловой первичный ключ, вы должны определить общедоступное свойство $incrementing в модели, для которого установлено значение false :
Если первичный ключ модели не является целочисленным, то определите защищенное свойство $keyType в модели. Это свойство имеет значение типа string :
«Составные» первичные ключи
Eloquent требует, чтобы каждая модель имела по крайней мере один однозначно идентифицирующий «ID», который может служить ее первичным ключом. «Составные» первичные ключи не поддерживаются моделями Eloquent. Однако вы можете добавить дополнительные многоколоночные уникальные индексы к таблицам базы данных в дополнение к однозначно определяющему (уникальному) первичному ключу таблицы.
Временные метки
По умолчанию Eloquent ожидает, что столбцы created_at и updated_at будут существовать в соответствующей таблице БД модели. Eloquent автоматически устанавливает значения этих столбцов при создании или обновлении моделей. Если вы не хотите, чтобы эти столбцы автоматически управлялись Eloquent, вы должны определить свойство $timestamps модели со значением false :
Если вам нужно настроить формат временных меток модели, то укажите необходимый формат для свойства $dateFormat . Это свойство определяет, как атрибуты даты хранятся в БД, а также их формат при сериализации модели в массив или JSON:
Если вам нужно настроить имена столбцов, используемых для хранения временных меток, то укажите значения для констант CREATED_AT и UPDATED_AT в модели:
Соединения с БД
По умолчанию все модели Eloquent будут использовать соединение с БД, настроенное для вашего приложения. Если вы хотите указать другое соединение, которое должно использоваться при взаимодействии с определенной моделью, вы должны определить свойство $connection модели:
Значения атрибутов по умолчанию
По умолчанию вновь созданный экземпляр модели не будет содержать никаких значений атрибутов. Если вы хотите определить значения по умолчанию для некоторых атрибутов модели, то укажите необходимые значения в свойстве $attributes модели:
Получение моделей
Создав модель и связанную с ней таблицу БД, все готово к извлечению данных из БД. Вы должны думать о каждой модели Eloquent как о мощном построителе запросов, позволяющем свободно выполнять запросы к таблице БД, связанной с моделью. Метод модели all получит все записи из связанной с моделью таблицы БД:
Создание запросов
Метод Eloquent all вернет все результаты из таблицы модели. Однако, поскольку каждая модель Eloquent служит построителем запросов, вы можете добавить дополнительные условия к запросам, а затем вызвать метод get для получения результатов:
Поскольку модель Eloquent является построителем запросов, вам следует просмотреть все методы, предлагаемые построителем запросов. Вы можете использовать любой из этих методов при написании запросов Eloquent.
Обновление моделей
Если у вас уже есть экземпляр модели Eloquent, полученный из БД, вы можете «обновить» модель, используя методы fresh и refresh . Метод fresh повторно извлечет модель из БД. Существующий экземпляр модели не будет затронут:
Метод refresh повторно обновит существующую модель, используя свежие данные из БД. Кроме того, будут обновлены все загруженные отношения:
Коллекции
Как мы видели, методы Eloquent, такие как all и get , получают несколько записей из БД. Однако эти методы не возвращают простой массив PHP. Вместо этого возвращается экземпляр Illuminate\Database\Eloquent\Collection .
Класс Eloquent Collection расширяет базовый класс Laravel Illuminate\Support\Collection , который содержит множество полезных методов для взаимодействия с коллекциями данных. Например, метод reject используется для удаления моделей из коллекции на основе результатов вызванного замыкания:
Помимо методов, предоставляемых базовым классом коллекции Laravel, класс коллекции Eloquent содержит несколько дополнительных методов, которые специально предназначены для взаимодействия с коллекциями моделей Eloquent.
Поскольку все коллекции Laravel реализуют итерируемые интерфейсы PHP, вы можете перебирать коллекции, как если бы они были массивом:
Разбиение результатов
Вашему приложению может не хватить памяти, если вы попытаетесь загрузить десятки тысяч записей Eloquent с помощью методов all или get . Вместо использования этих методов можно использовать метод chunk для более эффективной обработки большого количества моделей.
Метод chunk будет извлекать подмножество моделей Eloquent, передавая их в замыкание для обработки. Поскольку за один раз извлекается только текущая коллекция моделей Eloquent, метод chunk обеспечивает значительно меньшее потребление памяти при работе с большим количеством моделей:
Первым аргументом, передаваемым методу chunk , является количество записей, которые вы хотите получить за «порцию». Замыкание, переданное в качестве второго аргумента, будет вызвано для каждой части записей, полученной из БД. Будет выполнен запрос к БД для получения каждой части записей, переданных замыканию.
Если вы фильтруете результаты метода chunk на основе столбца, который вы также будете обновлять при итерации результатов, вам следует использовать метод chunkById . Использование метода chunk в этих сценариях может привести к неожиданным и противоречивым результатам. Внутренне метод chunkById всегда будет извлекать модели со столбцом id , большим, чем у последней модели в предыдущей «порции»:
Отложенная потоковая передача результатов
Метод lazy работает аналогично методу chunk в том смысле, что он выполняет запрос по частям. Однако вместо передачи каждого фрагмента непосредственно в замыкание, метод lazy() возвращает экземпляр LazyCollection одноуровневых моделей Eloquent, что позволяет вам взаимодействовать с результатами как с единым потоком:
Если вы фильтруете результаты метода lazy по столбцу, который впоследствии будет обновлен при итерации результатов, то вам следует использовать метод lazyById . Внутренне метод lazyById всегда будет извлекать модели со столбцом id , большим, чем у последней модели в предыдущей «порции»:
Курсоры
Подобно методу lazy , метод cursor используется для значительного уменьшения потребления памяти вашим приложением при итерации десятков тысяч записей модели Eloquent.
Метод cursor выполнит только один запрос к БД; однако отдельные модели Eloquent не будут включены в результирующий набор, пока они не будут фактически итерированы. Следовательно, только одна модель Eloquent хранится в памяти в любой момент времени при итерации с использованием курсора.
Поскольку метод cursor всегда хранит в памяти только одну модель Eloquent, то нетерпеливая загрузка отношений недопустима. Если вам нужно нетерпеливо загрузить отношения, то рассмотрите возможность использования метода lazy .
Внутри метод cursor использует генераторы PHP для реализации этого функционала:
Курсор возвращает экземпляр Illuminate\Support\LazyCollection . Отложенные коллекции позволяют использовать многие методы коллекций, доступные в типичных коллекциях Laravel, при одновременной загрузке в память только одной модели:
Хотя метод cursor использует гораздо меньше памяти, чем обычный запрос (удерживая в памяти только одну модель Eloquent), он все равно в конечном итоге может исчерпать память. Это связано с тем, что драйвер PDO PHP внутренне кэширует все необработанные результаты запросов в своем буфере. Если вы имеете дело с очень большим количеством записей Eloquent, то рассмотрите возможность использования метода lazy .
Расширенные подзапросы
Выборка
Eloquent также предлагает поддержку расширенных подзапросов, которая позволяет извлекать информацию из связанных таблиц в одном запросе. Например, давайте представим, что у нас есть таблица destinations (пункты назначения) и flights (рейсы). В таблице flights содержится столбец arrived_at , который указывает, когда рейс прибыл в пункт назначения.
Используя функциональность подзапроса, доступную для методов select и addSelect построителя запросов, мы можем выбрать все destinations и название рейса, который последним прибыл в этот пункт назначения, используя один запрос:
Сортировка
Кроме того, метод orderBy построителя запросов поддерживает подзапросы. Продолжая использовать наш пример полетов, мы можем использовать этот метод для сортировки всех пунктов назначения в зависимости от того, когда последний рейс прибыл в этот пункт назначения. Опять же, это можно сделать при выполнении одного запроса к БД:
Извлечение отдельных моделей
В дополнение к получению всех записей, соответствующих указанному запросу, вы также можете получить отдельные записи, используя методы find , first или firstWhere . Вместо того, чтобы возвращать коллекцию моделей, эти методы возвращают единственный экземпляр модели:
По желанию можно получить первый результат запроса или выполнить какое-либо другое действие, если результаты не найдены. Метод firstOr вернет первый результат, соответствующий запросу, или, если результаты не найдены, выполнит указанное замыкание. Значение, возвращаемое замыканием, будет считаться результатом метода firstOr :
Исключения при отсутствии результатов запроса
По желанию можно выбросить исключение, если модель не найдена. Это особенно полезно в маршрутах или контроллерах. Методы findOrFail и firstOrFail будут получать первый результат запроса; однако, если результат не найден, будет выброшено исключение Illuminate\Database\Eloquent\ModelNotFoundException :
Если исключение не перехвачено, то клиенту автоматически отправляется HTTP-ответ 404 :
Получение или создание моделей
Метод firstOrCreate попытается найти запись в БД, используя указанные пары столбец / значение. Если модель не может быть найдена в БД, будет вставлена запись с атрибутами, полученными в результате объединения первого аргумента массива с необязательным вторым аргументом массива:
Метод firstOrNew , как и firstOrCreate , попытается найти в БД запись, соответствующую указанным атрибутам. Однако, если модель не найдена, будет возвращен новый экземпляр модели. Обратите внимание, что модель, возвращенная firstOrNew , еще не сохранена в БД. Вам нужно будет вручную вызвать метод save , чтобы сохранить его:
Извлечение Агрегатов
При взаимодействии с моделями Eloquent вы также можете использовать count , sum , max и другие агрегатные методы, предоставляемые построителем запросов Laravel. Как и следовало ожидать, эти методы возвращают соответствующее скалярное значение вместо экземпляра модели Eloquent:
Вставка и обновление моделей
Вставка
Конечно, при использовании Eloquent нам нужно не только извлекать модели из БД. Также нам нужно вставлять новые записи. К счастью, Eloquent делает это просто. Чтобы вставить новую запись в БД, вы должны создать экземпляр новой модели и установить атрибуты модели. Затем вызовите метод save экземпляра модели:
В этом примере мы присваиваем параметр name из входящего HTTP-запроса атрибуту name экземпляра модели App\Models\Flight . Когда мы вызываем метод save , запись будет вставлена в БД. Временные метки created_at и updated_at будут автоматически установлены при вызове метода save , поэтому нет необходимости устанавливать их вручную.
В качестве альтернативы вы можете использовать метод create , чтобы «сохранить» новую модель с помощью одного оператора PHP. Вставленный экземпляр модели будет возвращен вам методом create :
Однако, перед использованием метода create вам нужно будет указать свойство fillable или guarded в классе модели. Эти свойства необходимы, потому что все модели Eloquent по умолчанию защищены от уязвимостей массового присвоения. Чтобы узнать больше о массовом присвоении, обратитесь к документации.
Обновление
Метод save также используется для обновления моделей, которые уже существуют в БД. Чтобы обновить модель, вы должны извлечь ее и установить любые атрибуты, которые вы хотите обновить. Затем вы должны вызвать метод save . Опять же, временная метка updated_at будет автоматически обновлена, поэтому нет необходимости вручную устанавливать ее значение:
Массовые обновления
Обновления также могут выполняться для моделей, соответствующих указанному запросу. В этом примере все рейсы, которые активны и имеют пункт назначения в Сан-Диего, будут помечены как задержанные:
Метод update ожидает массив пар ключей и значений, представляющих столбцы, которые должны быть обновлены.
События модели Eloquent saving , saved , updating , и updated при массовом обновлении не будут инициированы для затронутых моделей. Это связано с тем, что модели фактически никогда не извлекаются при массовом обновлении.
Изучение изменений атрибутов
Eloquent содержит методы isDirty , isClean и wasChanged для проверки внутреннего состояния модели и определения того, как изменились ее атрибуты с момента первоначального извлечения модели.
Метод isDirty определяет, были ли изменены какие-либо атрибуты модели с момента получения модели. Вы можете передать конкретное имя атрибута методу isDirty , чтобы определить, является ли конкретный атрибут «грязным». Метод isClean определяет, остался ли атрибут неизменным с момента получения модели. Этот метод также принимает необязательный аргумент атрибута:
Метод wasChanged определяет, были ли изменены какие-либо атрибуты при последнем сохранении модели в текущем цикле запроса. При необходимости вы можете передать имя атрибута, чтобы увидеть, был ли изменен конкретный атрибут:
Метод getOriginal возвращает массив, содержащий исходные атрибуты модели, независимо от каких-либо изменений в модели с момента ее получения. При необходимости вы можете передать конкретное имя атрибута, чтобы получить исходное значение определенного атрибута:
Массовое присвоение
Вы можете использовать метод create , чтобы «сохранить» новую модель с помощью одного оператора PHP. Вставленный экземпляр модели будет возвращен из метода:
Однако перед использованием метода create вам нужно будет указать свойство fillable или guarded в классе модели. Эти свойства необходимы, потому что все модели Eloquent по умолчанию защищены от уязвимостей массового присвоения.
Уязвимость массового присвоения возникает, когда пользователь передает неожиданное поле HTTP-запроса, и это поле изменяет столбец в вашей базе данных, чего вы никак не ожидали. Например, злоумышленник может отправить параметр is_admin через HTTP-запрос, который затем передается методу create модели, позволяя пользователю перейти на уровень администратора.
Итак, для начала вы должны определить, какие атрибуты модели вы хотите сделать массово-назначаемыми. Вы можете сделать это используя свойство $fillable модели. Например, давайте сделаем атрибут name нашей модели Flight массово-назначаемым:
После того, как вы указали, какие атрибуты массово-назначаемые, вы можете использовать метод create для вставки новой записи в базу данных. Метод create возвращает вновь созданный экземпляр модели:
Если у вас уже есть экземпляр модели, вы можете использовать метод fill для заполнения его массивом атрибутов:
Массовое присвоение и JSON-столбцы
При назначении JSON-столбцов необходимо указать массово назначаемый ключ для каждого столбца в массиве $fillable модели. В целях безопасности Laravel не поддерживает обновление вложенных атрибутов JSON при использовании свойства guarded :
Защита массового присвоения
Если вы хотите, чтобы все ваши атрибуты были массово-назначаемыми, вы можете определить свойство модели $guarded как пустой массив. Если вы решите не защищать свою модель, вам следует позаботиться о том, чтобы всегда вручную обрабатывать массивы, переданные в методы Eloquent fill , create и update :
Обновления-вставки
Иногда требуется обновить существующую модель или создать новую, если подходящей модели не существует. Как и метод firstOrCreate , метод updateOrCreate сохраняет модель, поэтому нет необходимости вручную вызывать метод save .
В приведенном ниже примере, если существует рейс с пунктом отправления «Окленд» и пунктом назначения «Сан-Диего», его столбцы price и discounted будут обновлены. Если такой рейс не существует, то будет создан новый рейс с атрибутами, полученными в результате слияния первого массива аргументов со вторым массивом аргументов:
Если вы хотите выполнить несколько «обновлений-вставок» в одном запросе, вам следует использовать вместо этого метод upsert . Первый аргумент метода состоит из значений для вставки или обновления, а второй аргумент перечисляет столбцы, которые однозначно идентифицируют записи в связанной таблице. Третий и последний аргументы метода – это массив столбцов, которые следует обновить, если соответствующая запись уже существует в БД. Метод upsert автоматически устанавливает временные метки created_at и updated_at , если они разрешены в модели:
Все системы БД, кроме SQL Server, требуют, чтобы столбцы во втором аргументе метода upsert имели «первичный» или «уникальный» индекс.
Удаление моделей
Чтобы удалить модель, вызовите метод delete экземпляра модели:
Вы можете вызвать метод truncate , чтобы удалить все записи базы данных, связанные с моделью. Операция truncate также сбрасывает все автоинкрементные идентификаторы в связанной с моделью таблице:
Удаление существующей модели по ее первичному ключу
В приведенном выше примере мы извлекаем модель из БД перед вызовом метода delete . Однако если вы знаете первичный ключ модели, вы можете удалить модель, не извлекая ее, вызвав метод destroy . Помимо единственного первичного ключа, метод destroy может принимать несколько первичных ключей, массив первичных ключей или коллекцию первичных ключей:
Метод destroy загружает каждую модель отдельно и вызывает для них метод delete , чтобы сработали события deleting и deleted должным образом для каждой модели.
Удаление моделей через запрос
Конечно, вы можете создать запрос Eloquent для удаления всех моделей, соответствующих условиям запроса. В этом примере мы удалим все рейсы, помеченные как неактивные. Как и массовые обновления, массовые удаления не вызывают никаких событий модели для удаляемых моделей:
События модели Eloquent deleting , и deleted при массовом удалении не будут инициированы для удаленных моделей. Это связано с тем, что модели фактически не извлекаются при выполнении оператора delete .
Программное удаление
Помимо фактического удаления записей из БД, Eloquent может также выполнять «программно удалять» модели. При таком удалении, они фактически не удаляются из БД. Вместо этого для модели устанавливается атрибут deleted_at , указывающий дату и время, когда модель была «удалена». Чтобы включить программное удаление модели, добавьте в модель трейт Illuminate\Database\Eloquent\SoftDeletes :
Трейт SoftDeletes автоматически типизирует атрибут deleted_at к экземпляру DateTime / Carbon .
Вам также следует добавить столбец deleted_at в таблицу БД. Построитель схемы Laravel содержит метод для создания этого столбца:
Теперь, когда вы вызываете метод delete модели, в столбце deleted_at будут установлены текущие дата и время. Однако, запись в базе данных модели останется в таблице. При запросе модели, использующей программное удаление, программно удаленные модели будут автоматически исключены из всех результатов запроса.
Чтобы определить, был ли данный экземпляр модели программно удален, используйте метод trashed :
Восстановление программно удаленных моделей
По желанию можно «восстановить» программно удаленную модель. Чтобы восстановить такую модель, используйте метод restore экземпляра модели. Метод restore установит в столбце deleted_at модели значение null :
Вы также можете использовать метод restore в запросе для восстановления нескольких моделей. Опять же, как и другие «массовые» операции, это не вызовет никаких событий модели для восстанавливаемых моделей:
Метод restore также используется при построении запросов, использующих отношения:
Удаление моделей без возможности восстановления
По желанию можно действительно удалить модель из БД. Вы можете использовать метод forceDelete , чтобы окончательно удалить модель из таблицы БД:
Вы также можете использовать метод forceDelete при построении запросов, использующих отношения Eloquent:
Запросы для моделей, использующих программное удаление
Включение программно удаленных моделей
Как отмечалось выше, программно удаленные модели будут автоматически исключены из результатов запроса. Однако, вы можете принудительно отобразить такие модели в результирующем наборе, используя метод withTrashed в запросе:
Метод withTrashed также используется в запросе, использующем отношения:
Извлечение только программно удаленных моделей
Метод onlyTrashed будет извлекать только программно удаленные модели:
Репликация (тиражирование) моделей
Вы можете создать несохраненную копию существующего экземпляра модели, используя метод replicate . Этот метод особенно полезен, когда у вас есть экземпляры модели, которые имеют много одинаковых атрибутов:
Области запроса
Глобальные области запроса
Глобальные области запроса позволяют добавлять ограничения ко всем запросам для конкретной модели. Программное удаление Laravel использует глобальные области запроса для извлечения «не удаленных» моделей из БД. Написание пользовательских глобальных областей предоставляет удобный и простой способ, гарантирующий, что в каждом запросе конкретной модели будут применены определенные ограничения.
Написание глобальных областей запроса
Написание глобальных областей запроса – это просто. Сначала определите класс, который реализует интерфейс Illuminate\Database\Eloquent\Scope . В Laravel нет специального каталога для размещения таких классов, поэтому вы можете разместить его в любом каталоге.
Интерфейс Scope требует, чтобы вы реализовали один метод: apply . В методе apply можно добавлять условия where или другие типы необходимых ограничений к запросу:
Если ваша глобальная область запроса добавляет столбцы в выражение SELECT запроса, то вы должны использовать метод addSelect вместо select . Это предотвратит непреднамеренную замену существующего выражения SELECT запроса.
Применение глобальных областей запроса
Чтобы назначить глобальную область запроса модели, вы должны переопределить метод модели booted и вызвать метод модели addGlobalScope . Метод addGlobalScope принимает экземпляр вашей области запроса как единственный аргумент:
После добавления области к модели App\Models\User в приведенном выше примере, вызов метода User::all() выполнит следующий SQL-запрос:
Анонимные глобальные области запроса
Eloquent также позволяет вам определять глобальные области запроса с использованием замыканий, что особенно полезно для простейших областей запроса, которые не требуют отдельного класса. При определении глобальной области запроса с помощью замыкания вы должны указать желаемое имя области в качестве первого аргумента метода addGlobalScope :
Игнорирование глобальных областей запроса
Для исключения глобальной области в текущем запросе, используйте метод withoutGlobalScope . Этот метод принимает имя класса глобальной области в качестве единственного аргумента:
Или, если вы определили глобальную область с помощью замыкания, то вы должны передать строковое имя, которое вы присвоили глобальной области:
Если вы хотите удалить несколько или даже все глобальные области запроса, то вы можете использовать метод withoutGlobalScopes :
Локальные области запроса
Локальные области запроса позволяют определять общие наборы ограничений запросов, которые можно легко повторно использовать в приложении. Например, вам может потребоваться часто получать всех пользователей, которые считаются «популярными». Чтобы определить область запроса, добавьте префикс scope к методу модели Eloquent.
Области запроса должны всегда возвращать экземпляр построителя запросов:
Использование локальных областей запроса
После определения области можно вызвать метод при выполнении запроса модели. Однако вы не должны включать префикс scope при вызове метода. Вы можете даже связывать вызовы различных областей:
Объединение нескольких областей модели Eloquent с помощью оператора or запроса может потребовать использования замыканий для достижения правильной логической группировки:
Поскольку это может быть громоздким, то Eloquent содержит метод orWhere «более высокого порядка», который позволяет вам свободно связывать области без использования замыканий:
Динамические области запроса
По желанию можно определить область с параметрами. Для начала просто добавьте дополнительные параметры в сигнатуру метода области запроса. Параметры области должны быть определены после параметра $query :
После того, как ожидаемые аргументы были добавлены в сигнатуру метода области запроса, вы можете передать аргументы при вызове области:
Сравнение моделей
По желанию можно определить, являются ли две модели «одинаковыми» или нет. Методы is и isNot могут использоваться для быстрой проверки наличия у двух моделей одного и того же первичного ключа, таблицы и соединения с базой данных:
Методы is и isNot также доступны при использовании отношений belongsTo , hasOne , morphTo , и morphOne . Этот метод особенно полезен, если вы хотите сравнить связанную модель без запроса на получение этой модели:
События
Модели Eloquent инициируют некоторые события, что позволяет использовать следующие хуки жизненного цикла модели: retrieved , creating , created , updating , updated , saving , saved , deleting , deleted , restoring , restored и replicating .
Событие retrieved сработает, когда существующая модель будет извлечена из БД. Когда новая модель сохраняется в первый раз, инициируются события creating и created . События updating / updated будут инициированы при изменении существующей модели и вызове метода save . События saving / saved будут инициированы при создании или обновлении модели – даже если атрибуты модели не были изменены.
Чтобы начать прослушивание событий модели, определите свойство $dispatchesEvents в модели Eloquent. Это свойство сопоставляет различные хуки жизненного цикла модели Eloquent с вашими собственными классами событий. Каждый класс событий модели должен ожидать получения экземпляра затронутой модели через свой конструктор:
После определения и сопоставления событий вы можете использовать слушателей событий для их обработки.
События модели Eloquent saved , updated , deleting , и deleted при массовом обновлении или удалении не будут инициированы для затронутых моделей. Это связано с тем, что модели фактически не извлекаются при массовом обновлении или удалении.
Использование замыканий
Вместо использования пользовательских классов событий можно регистрировать замыкания, которые выполняются при инициировании различных событий модели. Как правило, вы должны зарегистрировать эти замыкания в методе booted модели:
При необходимости вы можете использовать поочередных анонимных слушателей событий при регистрации событий модели. Это проинструктирует Laravel выполнить слушателя событий модели в фоновом режиме, используя очередь вашего приложения:
Наблюдатели
Определение наблюдателей
Если прослушивается множество событий в модели, то можно использовать наблюдателей, чтобы сгруппировать пользовательских слушателей в одном классе. Классы наблюдателей имеют имена методов, созвучные событиям Eloquent, которые необходимо прослушивать. Каждый из этих методов получает затронутую модель в качестве единственного аргумента. Чтобы сгенерировать нового наблюдателя, используйте команду make:observer Artisan:
Эта команда поместит новый класс наблюдателя в каталог app/Observers вашего приложения. Если этот каталог не существует в вашем приложении, то Laravel предварительно создаст его. Созданный наблюдатель может выглядеть следующим образом:
Чтобы зарегистрировать наблюдателя, вам нужно вызвать метод observe наблюдаемой модели. Вы можете зарегистрировать наблюдателей в методе boot поставщика служб вашего приложения App\Providers\EventServiceProvider :
Наблюдатели и транзакции базы данных
Когда модели создаются в рамках транзакции базы данных, можно дать команду наблюдателю выполнять его обработчики событий только после того, как транзакция базы данных будет зафиксирована. Это достижимо путем определения свойства $afterCommit наблюдателя. При отсутствии транзакции, обработчики событий будут выполнены незамедлительно:
Подавление событий
По желанию можно временно «заглушить» все события, запускаемые моделью. Вы можете добиться этого, используя метод withoutEvents . Метод withoutEvents принимает замыкание как единственный аргумент. Любой код, выполняемый в этом замыкании, не будет запускать события модели. Например, следующее извлечет и удалит экземпляр App\User , не вызывая никаких событий модели. Любое значение, возвращаемое переданным замыканием, будет возвращено методом withoutEvents :
Тихое сохранение одной модели
По желанию можно «сохранить» конкретную модель, не вызывая никаких событий. Вы можете сделать это с помощью метода saveQuietly :
Источник