PHP: Laravel
2026-02-26 18:03 Diff

Модель в MVC v2 – это слой приложения, отвечающий за связь с предметной областью. В нем находится вся бизнес-логика приложения. Для простоты реализации, сюда часто включают механизмы для работы с базой данных.

Очень важно понимать, что модель, как слой, существует независимо от фреймворка, HTTP и веба в целом. Вся остальная система может обращаться к моделям, но модели не могут знать и не знают ничего про среду, в которой они выполняются.

В том числе это значит, что мы можем работать с моделями вне фреймворка. В этом нам поможет Tinker. Одна из самых полезных возможностей Tinker – загрузить приложение и "поиграться" с моделями, поисследовать базу данных.

Текущая версия Tinker не умеет подтягивать изменения файлов в репл. Поэтому если вы что-то меняете в коде, с которым работаете в репле, придется его перезапускать.

Выполним полный пример, создадим новую статью, наполним ее данными и сохраним в базе:

Когда объект готов, его можно сохранить в базу данных. Для этого надо вызвать метод save():

Этот метод делает запрос INSERT в базу данных. Затем он обновляет сам объект:

  • Внутрь записывается идентификатор статьи взятый из базы данных.
  • Заполняются поля created_at и updated_at. Если это новая запись, то значения этих полей совпадают.

Созданный объект можно тут же поменять:

Изменение свойств никак не затрагивает базу данных. Все это происходит только на уровне самого объекта. Если в этот момент закрыть консоль, то все изменения потеряются. Для сохранения нужно опять вызвать save(). Этот метод универсальный, он подходит как для создания новой сущности, так и для ее обновления.

Метод save() выполняет запрос в базу только тогда, когда что-то поменялось. В этом случае обязательно меняется значение поля updated_at. Оно становится равным текущему времени.

Теперь предположим, что у нас нет переменной с текущей статьей. Например, мы перезапустили консоль. Каким образом получить нужный объект? Делается это с помощью статических методов, которые появляются у каждой модели. Самый простой способ достать запись, сделать поиск по ее идентификатору:

find ищет по первичному ключу и возвращает запись или null. Если ему передать массив ключей, то он вернет коллекцию, состоящую из записей по этим ключам. А если нужен поиск по полям, который вернет коллекцию, для этого подходит метод where:

Кроме where, нам понадобятся два похожих метода:

  • Model::all() извлекает все записи из таблицы. Такой метод подходит только в некоторых ситуациях, в основном при работе со справочниками где немного данных. В остальных случаях он может выбрать в память слишком много записей, что породит ненужную нагрузку на сервер.
  • Model::paginate($page) – извлекает записи постранично. Основной метод, который используется в списках.

И последнее, что можно сделать с сущностью, это удалить ее:

Состав модели

В реальных проектах от десятков до тысяч (или десятков тысяч!) сущностей. При таких количествах, помнить из чего состоят модели – невозможно. Более того, в проект могут и будут приходить новые люди, которые не знают структуры моделей.

Узнать какие поля есть у модели можно несколькими способами. Ими придется пользоваться регулярно:

  1. База данных. Всегда можно подключиться напрямую и посмотреть структуру таблицы. В разных базах данных это делается по-разному.

  2. Laravel имеет встроенный механизм извлечения структуры таблицы. Он сам им пользуется для работы модели.

  3. Пожалуй самый простой и распространенный способ — зайти в REPL, извлечь первую сущность нужной модели и распечатать ее.