Softdeletes laravel что это

Удаление данных в Eloquent Laravel

Мягкое удаление

Softdeletes laravel что это. Смотреть фото Softdeletes laravel что это. Смотреть картинку Softdeletes laravel что это. Картинка про Softdeletes laravel что это. Фото Softdeletes laravel что это

Softdeletes laravel что это. Смотреть фото Softdeletes laravel что это. Смотреть картинку Softdeletes laravel что это. Картинка про Softdeletes laravel что это. Фото Softdeletes laravel что это

Если у Вас появились вопросы по материалам на нашем сайте, то пожалуйста, пришлите нам их на почтовый адрес support@mousedc.ru. Мы обязательно ответим.

Также Вы можете отправить нам свой отзыв на наши слуги, замечание или предложение. Мы ценим наших клиентов и внимательно прислушиваемся ко всем замечаниям!

Softdeletes laravel что это. Смотреть фото Softdeletes laravel что это. Смотреть картинку Softdeletes laravel что это. Картинка про Softdeletes laravel что это. Фото Softdeletes laravel что это

Коврик для мыши новым клиентам

Оплатите хостинг на год и получите удобный коврик

Softdeletes laravel что это. Смотреть фото Softdeletes laravel что это. Смотреть картинку Softdeletes laravel что это. Картинка про Softdeletes laravel что это. Фото Softdeletes laravel что это

Помощь в переносе
с другого хостинга

Хотите переехать? Мы поможем перенести всё

Softdeletes laravel что это. Смотреть фото Softdeletes laravel что это. Смотреть картинку Softdeletes laravel что это. Картинка про Softdeletes laravel что это. Фото Softdeletes laravel что это

Запишитесь на интенсивные курсы по созданию сайтов.

Приветствуем всех в нашем уютном дата центре! Мы предоставляем качественный и надёжный хостинг. У нас можно заказать домены и VPS, прочитать статьи по созданию сайтов и информационной безопасности. А из наших видео подкастов можно узнать о том, как продвигать и развивать iT-проекты.

Источник

Laravel Framework Russian Community

Пролог

Начало работы

Основы архитектуры

Основы

Фронтенд

Безопасность

Копаем глубже

База данных

Eloquent ORM

Тестирование

Официальные пакеты

Eloquent: Начало работы

Введение

Система объектно-реляционного отображения (ORM) Eloquent — реализация шаблона ActiveRecord в Laravel. Каждая таблица имеет соответствующий класс-модель, который используется для работы с таблицей БД. Модели позволяют запрашивать данные из таблиц, а также вставлять в них новые записи.

Определение моделей

Простейший способ создать экземпляр модели — с помощью Artisan-команды make:model :

Принятые соглашения

Имена таблиц

Первичные ключи

Отметки времени

Если вам надо изменить имена столбцов для хранения отметок времени, вы можете задать константы CREATED_AT и UPDATED_AT :

Соединение с БД

Значения по умолчанию

Получение моделей

После создания модели и связанной с ней таблицы, вы можете начать получать данные из вашей БД. Каждая модель Eloquent представляет собой мощный конструктор запросов, позволяющий удобно выполнять запросы к связанной таблице. Например:

Добавление дополнительных ограничений

Метод all в Eloquent возвращает все результаты из таблицы модели. Поскольку модели Eloquent работают как конструктор запросов, вы можете также добавить ограничения в запрос, а затем использовать метод get для получения результатов:

Все методы, доступные в конструкторе запросов, также доступны при работе с моделями Eloquent. Вы можете использовать любой из них в запросах Eloquent.

Обновление данных в модели

Метод fresh делает запрос в базу данных и возвращает такую же модель с новыми данными. Существующая модель не изменяется:

Метод refresh перезаписывает текущую модель новыми данными из БД. Все заргуженные отношения обновляются тоже:

Коллекции

Вы также можете просто перебирать такую коллекцию в цикле как массив:

Разделение результата на блоки

Первый передаваемый в метод аргумент — число записей, получаемых в одном блоке. Передаваемая в качестве второго аргумента функция-замыкание будет вызываться для каждого блока, получаемого из БД. Для получения каждого блока записей, передаваемого в замыкание, будет выполнен запрос к базе данных.

Использование курсоров

Метод cursor позволяет проходить по записям базы данных, используя курсор, который выполняет только один запрос. При обработке больших объёмов данных метод cursor может значительно уменьшить расход памяти:

Продвинутые подзапросы

Выборка подзапросами

Сортировка результатов подзапросов

Кроме того, метод построителя запросов orderBy тоже поддерживает подзапросы. Мы можем использовать эту функциональность для сортировки всех пунктов назначения в зависимости от того, когда последний рейс прибыл в этот пункт назначения. Опять же, это может быть сделано во время выполнения одного запроса к базе данных:

Получение одиночных моделей / агрегатных функций

Также вы можете вызвать метод find с массивом первичных ключей, который вернёт коллекцию подходящих записей:

Иногда вы можете захотеть получить первый результат запроса или выполнить какое-либо другое действие, если результаты не найдены. Метод firstOr вернет первый найденный результат или, если результаты не найдены, выполнит заданную функцию. Результат этой функции будет результатом метода firstOr :

Метод firstOr также может принимать массив столбцов, если вам нужны определённые поля в модели:

Исключения в случае отсутствия результатов

Иногда вам нужно бросить исключение, если определённая модель не была найдена. Это удобно в роутах и контроллерах. Методы findOrFail и firstOrFail получают первый результат запроса. А если результатов не найдено, выбрасывается исключение Illuminate\Database\Eloquent\ModelNotFoundException :

Получение агрегатных функций

Вставка и изменение моделей

Вставки

Для создания новой записи в БД создайте экземпляр модели, задайте атрибуты модели и вызовите метод save :

Изменения

Массовые изменения

Метод update ожидает массив пар столбец/значение, обозначающий, какие столбцы необходимо изменить.

Контроль изменения данных в модели

Метод isDirty возвращает true если данные в модели изменялись с тех пор, как они были загружены из БД. Вы можете указать явно, какой аттрибут нужно проверить. Метод isClean является противоположностью isDirty :

Метод wasChanged определяет, были ли изменены какие-либо атрибуты при последнем сохранении модели в течение текущего цикла запроса. Вы также можете передать имя атрибута, чтобы посмотреть, был ли изменен тот или иной атрибут:

Массовое назначение

Теперь мы можем использовать метод create для вставки новой записи в БД. Метод create возвращает сохранённый экземпляр модели:

Если у вас уже есть экземпляр модели, вы можете заполнить его массивом атрибутов с помощью метода fill :

Защитные атрибуты

В данном примере всем атрибутам кроме price разрешено массовое заполнение:

Другие методы создания

firstOrCreate / firstOrNew

updateOrCreate

Удаление моделей

Для удаления модели вызовите метод delete на её экземпляре:

Удаление существующей модели по ключу

Удаление модели запросом

Вы также можете выполнить оператор удаления на наборе моделей. В этом примере мы удалим все рейсы, отмеченные неактивными. Подобно массовому обновлению, массовое удаление не вызовет никаких событий для удаляемых моделей:

Псевдоудаление

Разумеется, вам необходимо добавить столбец deleted_at в вашу таблицу. Для этого используется хелпер конструктора таблиц:

Для определения того, удалён ли экземпляр модели, используйте метод trashed :

Запрос псевдоудалённых моделей

Включение псевдоудалённых моделей

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

Метод withTrashed может быть использован в отношениях:

Получение только псевдоудалённых моделей

Если вы хотите получить только псевдоудалённые модели, вызовите метод onlyTrashed :

Восстановление псевдоудалённых моделей

Иногда необходимо восстановить псевдоудалённую модель. Для восстановления псевдоудалённой модели в активное состояние используется метод restore :

Вы также можете использовать его в запросе для быстрого восстановления нескольких моделей. Подобно другим массовым операциям, это не вызовет никаких событий для восстанавливаемых моделей:

Перманентное удаление моделей

Репликация моделей

Скоупы запросов (query scopes)

Глобальные скоупы

Глобальные скоупы позволяют добавить ограничения во все запросы для данной модели. Собственная функция Laravel псевдоудаление использует глобальные скоупы, чтобы получать из базы данных только «неудалённые» модели. Написание собственных глобальных скоупы обеспечивает удобный и простой способ наложить определённые ограничения на каждый запрос для конкретной модели.

Написание глобальных скоупов

Применение глобальных скоупов

Вам надо переопределить метод boot данной модели и использовать метод addGlobalScope :

После этого запрос к User::all() будет создавать следующий SQL:

Глобальные скоупы с помощью функций

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

Удаление глобальных скоупов

Или, если вы использовали не класс, а функцию:

Если вы хотите удалить несколько или все глобальные скоупы, то можете использовать метод withoutGlobalScopes :

Локальные скоупы

Скоупы всегда должны возвращать экземпляр конструктора запросов:

Использование локального скоупа

Для формирования отношения «или» воспользуйтесь анонимной функцией:

Динамические скоупы

А затем передайте их при вызове метода скоупа:

Сравнение моделей

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

События

После определения событий Eloquent, вы можете использовать слушателей событий для обработки событий.

Обсерверы (наблюдатели)

Определение обсерверов

Если вы прослушиваете много событий для определённой модели, вы можете использовать обверверы (observers) для объединения всех слушателей в единый класс. В таких класах названия методов отражают те события Eloquent, которые вы хотите прослушивать. Каждый такой метод получает модель в качестве единственного аргумента.

Artisan-команда make:observer создаст файл обсервера в папке App/Observers :

Будет создан класс такого вида:

Для регистрации обсервера используйте метод observe на модели, которую хотите наблюдать. Вы можете зарегистрировать обсерверы в методе boot одного из ваших сервис-провайдеров. В этом примере мы зарегистрируем его в AppServiceProvider :

Источник

Laravel 8 · Eloquent · Начало работы

Введение

Laravel содержит библиотеку Eloquent ORM (объектно-реляционное отображение), которая позволяет с удовольствием взаимодействовать с базой данных. При использовании Eloquent каждая таблица БД имеет соответствующую «Модель», которая используется для взаимодействия с этой таблицей. Помимо получения записей из таблицы БД, модели Eloquent также позволяют вставлять, обновлять и удалять записи из таблицы.

Генерация классов модели

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

Соглашения по именованию моделей Eloquent

Именование таблиц

Если таблица БД вашей модели не соответствует этому соглашению, вы можете вручную указать имя таблицы модели, определив свойство table в модели:

Первичные ключи

«Составные» первичные ключи

Eloquent требует, чтобы каждая модель имела по крайней мере один однозначно идентифицирующий «ID», который может служить ее первичным ключом. «Составные» первичные ключи не поддерживаются моделями Eloquent. Однако вы можете добавить дополнительные многоколоночные уникальные индексы к таблицам базы данных в дополнение к однозначно определяющему (уникальному) первичному ключу таблицы.

Временные метки

Если вам нужно настроить имена столбцов, используемых для хранения временных меток, то укажите значения для констант CREATED_AT и UPDATED_AT в модели:

Соединения с БД

Значения атрибутов по умолчанию

Получение моделей

Создав модель и связанную с ней таблицу БД, все готово к извлечению данных из БД. Вы должны думать о каждой модели Eloquent как о мощном построителе запросов, позволяющем свободно выполнять запросы к таблице БД, связанной с моделью. Метод модели all получит все записи из связанной с моделью таблицы БД:

Создание запросов

Метод Eloquent all вернет все результаты из таблицы модели. Однако, поскольку каждая модель Eloquent служит построителем запросов, вы можете добавить дополнительные условия к запросам, а затем вызвать метод get для получения результатов:

Поскольку модель Eloquent является построителем запросов, вам следует просмотреть все методы, предлагаемые построителем запросов. Вы можете использовать любой из этих методов при написании запросов Eloquent.

Обновление моделей

Метод refresh повторно обновит существующую модель, используя свежие данные из БД. Кроме того, будут обновлены все загруженные отношения:

Коллекции

Помимо методов, предоставляемых базовым классом коллекции Laravel, класс коллекции Eloquent содержит несколько дополнительных методов, которые специально предназначены для взаимодействия с коллекциями моделей Eloquent.

Поскольку все коллекции Laravel реализуют итерируемые интерфейсы PHP, вы можете перебирать коллекции, как если бы они были массивом:

Разбиение результатов

Метод chunk будет извлекать подмножество моделей Eloquent, передавая их в замыкание для обработки. Поскольку за один раз извлекается только текущая коллекция моделей Eloquent, метод chunk обеспечивает значительно меньшее потребление памяти при работе с большим количеством моделей:

Отложенная потоковая передача результатов

Метод lazy работает аналогично методу chunk в том смысле, что он выполняет запрос по частям. Однако вместо передачи каждого фрагмента непосредственно в замыкание, метод lazy() возвращает экземпляр LazyCollection одноуровневых моделей Eloquent, что позволяет вам взаимодействовать с результатами как с единым потоком:

Курсоры

Метод cursor выполнит только один запрос к БД; однако отдельные модели Eloquent не будут включены в результирующий набор, пока они не будут фактически итерированы. Следовательно, только одна модель Eloquent хранится в памяти в любой момент времени при итерации с использованием курсора.

Внутри метод cursor использует генераторы PHP для реализации этого функционала:

Расширенные подзапросы

Выборка

Используя функциональность подзапроса, доступную для методов select и addSelect построителя запросов, мы можем выбрать все destinations и название рейса, который последним прибыл в этот пункт назначения, используя один запрос:

Сортировка

Кроме того, метод orderBy построителя запросов поддерживает подзапросы. Продолжая использовать наш пример полетов, мы можем использовать этот метод для сортировки всех пунктов назначения в зависимости от того, когда последний рейс прибыл в этот пункт назначения. Опять же, это можно сделать при выполнении одного запроса к БД:

Извлечение отдельных моделей

По желанию можно получить первый результат запроса или выполнить какое-либо другое действие, если результаты не найдены. Метод firstOr вернет первый результат, соответствующий запросу, или, если результаты не найдены, выполнит указанное замыкание. Значение, возвращаемое замыканием, будет считаться результатом метода firstOr :

Исключения при отсутствии результатов запроса

По желанию можно выбросить исключение, если модель не найдена. Это особенно полезно в маршрутах или контроллерах. Методы findOrFail и firstOrFail будут получать первый результат запроса; однако, если результат не найден, будет выброшено исключение Illuminate\Database\Eloquent\ModelNotFoundException :

Если исключение не перехвачено, то клиенту автоматически отправляется HTTP-ответ 404 :

Получение или создание моделей

Метод firstOrCreate попытается найти запись в БД, используя указанные пары столбец / значение. Если модель не может быть найдена в БД, будет вставлена запись с атрибутами, полученными в результате объединения первого аргумента массива с необязательным вторым аргументом массива:

Извлечение Агрегатов

Вставка и обновление моделей

Вставка

Конечно, при использовании Eloquent нам нужно не только извлекать модели из БД. Также нам нужно вставлять новые записи. К счастью, Eloquent делает это просто. Чтобы вставить новую запись в БД, вы должны создать экземпляр новой модели и установить атрибуты модели. Затем вызовите метод save экземпляра модели:

Однако, перед использованием метода create вам нужно будет указать свойство fillable или guarded в классе модели. Эти свойства необходимы, потому что все модели Eloquent по умолчанию защищены от уязвимостей массового присвоения. Чтобы узнать больше о массовом присвоении, обратитесь к документации.

Обновление

Массовые обновления

Обновления также могут выполняться для моделей, соответствующих указанному запросу. В этом примере все рейсы, которые активны и имеют пункт назначения в Сан-Диего, будут помечены как задержанные:

Метод update ожидает массив пар ключей и значений, представляющих столбцы, которые должны быть обновлены.

Изучение изменений атрибутов

Метод wasChanged определяет, были ли изменены какие-либо атрибуты при последнем сохранении модели в текущем цикле запроса. При необходимости вы можете передать имя атрибута, чтобы увидеть, был ли изменен конкретный атрибут:

Метод getOriginal возвращает массив, содержащий исходные атрибуты модели, независимо от каких-либо изменений в модели с момента ее получения. При необходимости вы можете передать конкретное имя атрибута, чтобы получить исходное значение определенного атрибута:

Массовое присвоение

Однако перед использованием метода create вам нужно будет указать свойство fillable или guarded в классе модели. Эти свойства необходимы, потому что все модели Eloquent по умолчанию защищены от уязвимостей массового присвоения.

Уязвимость массового присвоения возникает, когда пользователь передает неожиданное поле HTTP-запроса, и это поле изменяет столбец в вашей базе данных, чего вы никак не ожидали. Например, злоумышленник может отправить параметр is_admin через HTTP-запрос, который затем передается методу create модели, позволяя пользователю перейти на уровень администратора.

После того, как вы указали, какие атрибуты массово-назначаемые, вы можете использовать метод create для вставки новой записи в базу данных. Метод create возвращает вновь созданный экземпляр модели:

Если у вас уже есть экземпляр модели, вы можете использовать метод fill для заполнения его массивом атрибутов:

Массовое присвоение и JSON-столбцы

Защита массового присвоения

Обновления-вставки

В приведенном ниже примере, если существует рейс с пунктом отправления «Окленд» и пунктом назначения «Сан-Диего», его столбцы price и discounted будут обновлены. Если такой рейс не существует, то будет создан новый рейс с атрибутами, полученными в результате слияния первого массива аргументов со вторым массивом аргументов:

Все системы БД, кроме SQL Server, требуют, чтобы столбцы во втором аргументе метода upsert имели «первичный» или «уникальный» индекс.

Удаление моделей

Чтобы удалить модель, вызовите метод delete экземпляра модели:

Удаление существующей модели по ее первичному ключу

Удаление моделей через запрос

Конечно, вы можете создать запрос Eloquent для удаления всех моделей, соответствующих условиям запроса. В этом примере мы удалим все рейсы, помеченные как неактивные. Как и массовые обновления, массовые удаления не вызывают никаких событий модели для удаляемых моделей:

Программное удаление

Вам также следует добавить столбец deleted_at в таблицу БД. Построитель схемы Laravel содержит метод для создания этого столбца:

Теперь, когда вы вызываете метод delete модели, в столбце deleted_at будут установлены текущие дата и время. Однако, запись в базе данных модели останется в таблице. При запросе модели, использующей программное удаление, программно удаленные модели будут автоматически исключены из всех результатов запроса.

Чтобы определить, был ли данный экземпляр модели программно удален, используйте метод trashed :

Восстановление программно удаленных моделей

По желанию можно «восстановить» программно удаленную модель. Чтобы восстановить такую модель, используйте метод restore экземпляра модели. Метод restore установит в столбце deleted_at модели значение null :

Вы также можете использовать метод restore в запросе для восстановления нескольких моделей. Опять же, как и другие «массовые» операции, это не вызовет никаких событий модели для восстанавливаемых моделей:

Метод restore также используется при построении запросов, использующих отношения:

Удаление моделей без возможности восстановления

Вы также можете использовать метод forceDelete при построении запросов, использующих отношения Eloquent:

Запросы для моделей, использующих программное удаление

Включение программно удаленных моделей

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

Метод withTrashed также используется в запросе, использующем отношения:

Извлечение только программно удаленных моделей

Метод onlyTrashed будет извлекать только программно удаленные модели:

Репликация (тиражирование) моделей

Области запроса

Глобальные области запроса

Глобальные области запроса позволяют добавлять ограничения ко всем запросам для конкретной модели. Программное удаление Laravel использует глобальные области запроса для извлечения «не удаленных» моделей из БД. Написание пользовательских глобальных областей предоставляет удобный и простой способ, гарантирующий, что в каждом запросе конкретной модели будут применены определенные ограничения.

Написание глобальных областей запроса

Применение глобальных областей запроса

После добавления области к модели App\Models\User в приведенном выше примере, вызов метода User::all() выполнит следующий SQL-запрос:

Анонимные глобальные области запроса

Eloquent также позволяет вам определять глобальные области запроса с использованием замыканий, что особенно полезно для простейших областей запроса, которые не требуют отдельного класса. При определении глобальной области запроса с помощью замыкания вы должны указать желаемое имя области в качестве первого аргумента метода addGlobalScope :

Игнорирование глобальных областей запроса

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

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

Локальные области запроса

Локальные области запроса позволяют определять общие наборы ограничений запросов, которые можно легко повторно использовать в приложении. Например, вам может потребоваться часто получать всех пользователей, которые считаются «популярными». Чтобы определить область запроса, добавьте префикс scope к методу модели Eloquent.

Области запроса должны всегда возвращать экземпляр построителя запросов:

Использование локальных областей запроса

После определения области можно вызвать метод при выполнении запроса модели. Однако вы не должны включать префикс scope при вызове метода. Вы можете даже связывать вызовы различных областей:

Объединение нескольких областей модели Eloquent с помощью оператора or запроса может потребовать использования замыканий для достижения правильной логической группировки:

Поскольку это может быть громоздким, то Eloquent содержит метод orWhere «более высокого порядка», который позволяет вам свободно связывать области без использования замыканий:

Динамические области запроса

После того, как ожидаемые аргументы были добавлены в сигнатуру метода области запроса, вы можете передать аргументы при вызове области:

Сравнение моделей

По желанию можно определить, являются ли две модели «одинаковыми» или нет. Методы is и isNot могут использоваться для быстрой проверки наличия у двух моделей одного и того же первичного ключа, таблицы и соединения с базой данных:

События

После определения и сопоставления событий вы можете использовать слушателей событий для их обработки.

Использование замыканий

Вместо использования пользовательских классов событий можно регистрировать замыкания, которые выполняются при инициировании различных событий модели. Как правило, вы должны зарегистрировать эти замыкания в методе booted модели:

При необходимости вы можете использовать поочередных анонимных слушателей событий при регистрации событий модели. Это проинструктирует Laravel выполнить слушателя событий модели в фоновом режиме, используя очередь вашего приложения:

Наблюдатели

Определение наблюдателей

Если прослушивается множество событий в модели, то можно использовать наблюдателей, чтобы сгруппировать пользовательских слушателей в одном классе. Классы наблюдателей имеют имена методов, созвучные событиям Eloquent, которые необходимо прослушивать. Каждый из этих методов получает затронутую модель в качестве единственного аргумента. Чтобы сгенерировать нового наблюдателя, используйте команду make:observer Artisan:

Эта команда поместит новый класс наблюдателя в каталог app/Observers вашего приложения. Если этот каталог не существует в вашем приложении, то Laravel предварительно создаст его. Созданный наблюдатель может выглядеть следующим образом:

Чтобы зарегистрировать наблюдателя, вам нужно вызвать метод observe наблюдаемой модели. Вы можете зарегистрировать наблюдателей в методе boot поставщика служб вашего приложения App\Providers\EventServiceProvider :

Наблюдатели и транзакции базы данных

Подавление событий

Тихое сохранение одной модели

По желанию можно «сохранить» конкретную модель, не вызывая никаких событий. Вы можете сделать это с помощью метода saveQuietly :

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *