HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Модель в MVC v2 - это слой приложения, отвечающий за связь с предметной областью. В нем находится вся бизнес-логика приложения. Для простоты реализации, сюда часто включают механизмы для работы с базой данных.</p>
1 <p>Модель в MVC v2 - это слой приложения, отвечающий за связь с предметной областью. В нем находится вся бизнес-логика приложения. Для простоты реализации, сюда часто включают механизмы для работы с базой данных.</p>
2 <p>Очень важно понимать, что модель, как слой, существует независимо от фреймворка, HTTP и веба в целом. Вся остальная система может обращаться к моделям, но модели не могут знать и не знают ничего про среду, в которой они выполняются.</p>
2 <p>Очень важно понимать, что модель, как слой, существует независимо от фреймворка, HTTP и веба в целом. Вся остальная система может обращаться к моделям, но модели не могут знать и не знают ничего про среду, в которой они выполняются.</p>
3 <p>В том числе это значит, что мы можем работать с моделями вне фреймворка. В этом нам поможет Tinker. Одна из самых полезных возможностей Tinker - загрузить приложение и "поиграться" с моделями, поисследовать базу данных.</p>
3 <p>В том числе это значит, что мы можем работать с моделями вне фреймворка. В этом нам поможет Tinker. Одна из самых полезных возможностей Tinker - загрузить приложение и "поиграться" с моделями, поисследовать базу данных.</p>
4 <p><em>Текущая версия Tinker не умеет подтягивать изменения файлов в репл. Поэтому если вы что-то меняете в коде, с которым работаете в репле, придется его перезапускать.</em></p>
4 <p><em>Текущая версия Tinker не умеет подтягивать изменения файлов в репл. Поэтому если вы что-то меняете в коде, с которым работаете в репле, придется его перезапускать.</em></p>
5 <p>Выполним полный пример, создадим новую статью, наполним ее данными и сохраним в базе:</p>
5 <p>Выполним полный пример, создадим новую статью, наполним ее данными и сохраним в базе:</p>
6 <p>Когда объект готов, его можно сохранить в базу данных. Для этого надо вызвать метод save():</p>
6 <p>Когда объект готов, его можно сохранить в базу данных. Для этого надо вызвать метод save():</p>
7 <p>Этот метод делает запрос<em>INSERT</em>в базу данных. Затем он обновляет сам объект:</p>
7 <p>Этот метод делает запрос<em>INSERT</em>в базу данных. Затем он обновляет сам объект:</p>
8 <ul><li>Внутрь записывается идентификатор статьи взятый из базы данных.</li>
8 <ul><li>Внутрь записывается идентификатор статьи взятый из базы данных.</li>
9 <li>Заполняются поля<em>created_at</em>и<em>updated_at</em>. Если это новая запись, то значения этих полей совпадают.</li>
9 <li>Заполняются поля<em>created_at</em>и<em>updated_at</em>. Если это новая запись, то значения этих полей совпадают.</li>
10 </ul><p>Созданный объект можно тут же поменять:</p>
10 </ul><p>Созданный объект можно тут же поменять:</p>
11 <p>Изменение свойств никак не затрагивает базу данных. Все это происходит только на уровне самого объекта. Если в этот момент закрыть консоль, то все изменения потеряются. Для сохранения нужно опять вызвать save(). Этот метод универсальный, он подходит как для создания новой сущности, так и для ее обновления.</p>
11 <p>Изменение свойств никак не затрагивает базу данных. Все это происходит только на уровне самого объекта. Если в этот момент закрыть консоль, то все изменения потеряются. Для сохранения нужно опять вызвать save(). Этот метод универсальный, он подходит как для создания новой сущности, так и для ее обновления.</p>
12 <p>Метод save() выполняет запрос в базу только тогда, когда что-то поменялось. В этом случае обязательно меняется значение поля<em>updated_at</em>. Оно становится равным текущему времени.</p>
12 <p>Метод save() выполняет запрос в базу только тогда, когда что-то поменялось. В этом случае обязательно меняется значение поля<em>updated_at</em>. Оно становится равным текущему времени.</p>
13 <p>Теперь предположим, что у нас нет переменной с текущей статьей. Например, мы перезапустили консоль. Каким образом получить нужный объект? Делается это с помощью статических методов, которые появляются у каждой модели. Самый простой способ достать запись, сделать поиск по ее идентификатору:</p>
13 <p>Теперь предположим, что у нас нет переменной с текущей статьей. Например, мы перезапустили консоль. Каким образом получить нужный объект? Делается это с помощью статических методов, которые появляются у каждой модели. Самый простой способ достать запись, сделать поиск по ее идентификатору:</p>
14 <p><em>find</em>ищет по первичному ключу и возвращает запись или<em>null</em>. Если ему передать массив ключей, то он вернет коллекцию, состоящую из записей по этим ключам. А если нужен поиск по полям, который вернет коллекцию, для этого подходит метод<em>where</em>:</p>
14 <p><em>find</em>ищет по первичному ключу и возвращает запись или<em>null</em>. Если ему передать массив ключей, то он вернет коллекцию, состоящую из записей по этим ключам. А если нужен поиск по полям, который вернет коллекцию, для этого подходит метод<em>where</em>:</p>
15 <p>Кроме<em>where</em>, нам понадобятся два похожих метода:</p>
15 <p>Кроме<em>where</em>, нам понадобятся два похожих метода:</p>
16 <ul><li>Model::all() извлекает все записи из таблицы. Такой метод подходит только в некоторых ситуациях, в основном при работе со справочниками где немного данных. В остальных случаях он может выбрать в память слишком много записей, что породит ненужную нагрузку на сервер.</li>
16 <ul><li>Model::all() извлекает все записи из таблицы. Такой метод подходит только в некоторых ситуациях, в основном при работе со справочниками где немного данных. В остальных случаях он может выбрать в память слишком много записей, что породит ненужную нагрузку на сервер.</li>
17 <li>Model::paginate($page) - извлекает записи постранично. Основной метод, который используется в списках.</li>
17 <li>Model::paginate($page) - извлекает записи постранично. Основной метод, который используется в списках.</li>
18 </ul><p>И последнее, что можно сделать с сущностью, это удалить ее:</p>
18 </ul><p>И последнее, что можно сделать с сущностью, это удалить ее:</p>
19 <h2>Состав модели</h2>
19 <h2>Состав модели</h2>
20 <p>В реальных проектах от десятков до тысяч (или десятков тысяч!) сущностей. При таких количествах, помнить из чего состоят модели - невозможно. Более того, в проект могут и будут приходить новые люди, которые не знают структуры моделей.</p>
20 <p>В реальных проектах от десятков до тысяч (или десятков тысяч!) сущностей. При таких количествах, помнить из чего состоят модели - невозможно. Более того, в проект могут и будут приходить новые люди, которые не знают структуры моделей.</p>
21 <p>Узнать какие поля есть у модели можно несколькими способами. Ими придется пользоваться регулярно:</p>
21 <p>Узнать какие поля есть у модели можно несколькими способами. Ими придется пользоваться регулярно:</p>
22 <ol><li><p>База данных. Всегда можно подключиться напрямую и посмотреть структуру таблицы. В разных базах данных это делается по-разному.</p>
22 <ol><li><p>База данных. Всегда можно подключиться напрямую и посмотреть структуру таблицы. В разных базах данных это делается по-разному.</p>
23 </li>
23 </li>
24 <li><p>Laravel имеет встроенный механизм извлечения структуры таблицы. Он сам им пользуется для работы модели.</p>
24 <li><p>Laravel имеет встроенный механизм извлечения структуры таблицы. Он сам им пользуется для работы модели.</p>
25 </li>
25 </li>
26 <li><p>Пожалуй самый простой и распространенный способ - зайти в REPL, извлечь первую сущность нужной модели и распечатать ее.</p>
26 <li><p>Пожалуй самый простой и распространенный способ - зайти в REPL, извлечь первую сущность нужной модели и распечатать ее.</p>
27 </li>
27 </li>
28 </ol>
28 </ol>