Получить заполняемые поля в Laravel - PullRequest
0 голосов
/ 28 февраля 2019

В laravel 5.4 я могу получить заполняемые поля, используя fillable индекс экземпляра модели.

$model = new AnyClass();
dd($model['fillable']);

Приведенный выше код печатает все заполняемые поля AnyClass.Но тот же код печатает null на Laravel 5.6.Я знаю, что могу получить заполняемые поля, используя $model->getFillable().Мой вопрос в чем причина / почему он не работает в laravel 5.6, но работает в 5.4?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Если вы посмотрите на исходный код Laravel, вы увидите разницу.

Класс Model, расширенный моделями приложений, реализует интерфейс ArrayAccess, который, помимо прочего, принудительно вызывает классчтобы определить метод offsetGet.

В Laravel 5.4 метод offsetGet выглядит следующим образом:

public function offsetGet($offset)
{
    return $this->$offset;
}

, что означает, что если вы вызываете $model['fillable'], вы фактически вызываете $model->offsetGet('fillable')который на самом деле возвращает свойство fillable класса.

Я не смог найти тег Laravel 5.6, но я почти уверен, что это тот же код, что и Laravel 5.5.45.В этой версии метод offsetGet был изменен на:

public function offsetGet($offset)
{
    return $this->getAttribute($offset);
}

, что означает, что он фактически возвращает атрибут, если он найден, или ноль в противном случае.

0 голосов
/ 28 февраля 2019

Измените свойство в классе на public $fillable = [ вместо protected $fillable = [

0 голосов
/ 28 февраля 2019

Из руководства по обновлению здесь Я полагаю, что это ответ на вопрос:

Методы модели и имена атрибутов

Чтобы предотвратить доступ к закрытым свойствам модели при использовании доступа к массиву, больше нельзя иметь метод модели с тем же именем, что и у атрибута или свойства.Это приведет к возникновению исключительных ситуаций при доступе к атрибутам модели через доступ к массиву ($user['name']) или вспомогательную функцию data_get.

...