Есть множество вещей в Laravel Eloquent ORM, но чтобы начать этот цикл статей, мы начнем с самого начала и рассмотрим, как загружаются и конструируются модели Eloquent.
В этом руководстве мы будем использовать для примера такую модель.
class Post extends Eloquent
{
$fillable = ['title', 'content'];
}
Такой выбор связан с тем, что пока мы рассматриваем только стандартное поведение Eloquent, перед тем как начнем что-либо модифицировать.
Сейчас мы рассмотрим, что происходит при вызове PHPnew Post(['post.title' => 'First Post', 'content' => 'lorem'])
.
Сначала мы попадаем в PHP__construct
. Первое что мы проверим — это проверяет ли эта модель, была ли она загружена. Для этого она проверяет статическое свойство PHPbooted
родительского класса Eloquent по ключу массива, в нашем случае это Post. Мы впервые сконструировали экземпляр нашей модели Post, далее нам надо ее загрузить, вызвав метод PHPboot
.
Теперь в PHPboot
нам надо сделать несколько небольших хитростей.
По существу, PHPboot
проходит через модель Post и находит все мутаторы, используя регулярные выражения, и сохраняет их в PHPthemutatorCache
в Eloquent в массиве с ключом Post. Затем мы идем дальше и устанавливаем PHPbooted['Post']
в PHPtrue
, поэтому нам не придется делать это снова в следующий раз, когда нам понадобиться экземпляр Post.
Наконец, в самом конструкторе мы только вызываем PHPfill
с атрибутами, передаваемыми конструктору. В PHPfill
мы пройдем по каждому из наших атрибутов и сделаем следующее. Сначала мы проверим, используется ли в атрибуте точечный синтаксис для ключа. Это нужно для того, чтобы удалить все возможные имена таблиц, такие как post.title, и заменить их на title. Теперь мы проверим, разрешено ли атрибуту массовое назначение (mass assigment), с помощью вызова PHPisFillable
.
В PHPisFillable
мы проверяем несколько разных способов, которыми может быть обработано массовое назначение. Сначала мы смотрим, установлена ли модель как PHPunguarded
, и если это так, то разрешаем назначение. Далее мы проверяем, находится ли атрибут в массиве PHPfillable
, тогда мы разрешаем назначение еще раз. Затем вызывается PHPisGuarded
, который проверяет, находится ли ключ в массиве PHPguarded
, или PHPguarded
содержит знак звездочки PHParray('*')
(который ставится по умолчанию), тогда мы не разрешаем массовое назначение. Наконец, если PHPfillable
пустой, мы возвращаем PHPtrue
, если ключ не начинается с подчеркивания, которое используется для скрытых атрибутов, как это принято и в Rails.
Если находится PHPunfillable
-ключ, то мы проверяем, является ли модель PHPtotallyGuarded
. По сути это значит, что если PHPfillable
пустой и PHPguarded
содержит знак * (по умолчанию), тогда возникает исключение PHPMassAssignmentException
. Это значит, что если вы не измените свойства PHPfillable
или PHPguarded
, то при попытке вызвать PHPfill
будет возникать исключение PHPMassAssignmentExceptions
.
Но если мы разрешим заполнение атрибута, то нам надо сделать PHPsetAttribute
. Здесь мы проверяем мутаторы в PHPmutatorCache
, о котором говорилось выше. Если есть совпадение, то мы вызываем этот мутатор, который может содержать любую нужную нам логику. Далее мы проверяем, есть ли ключ в массиве PHPdates
. Если так, то мы задаем значение экземпляру PHPCarbon
, который является мощным расширением PHP-объекта Date. В конце мы задаем значение ключу в массиве PHPattributes
.
Наконец, мы возвращаем этот экземпляр пользователю, и наша модель Eloquent полностью загружена. Примечание: конструктор никак не затрагивает отношения, базу данных или изменение данных.