Допустим, у меня есть конечная точка для форм, отправленных пользователем. Ввод формы будет сохранен как объект JSON в столбце таблицы базы данных, а идентификатор пользователя будет сохранен в другом. Поскольку я не хочу, чтобы пользователи могли каким-либо образом устанавливать любой идентификатор пользователя, который они хотят, я оставил столбец user_id вне переменной $ fillable модели Eloquent.

Метод create () принимает массив пар ключ / значение для назначения, но присваивает значения только заполняемым столбцам. Как мне одновременно добавить идентификатор пользователя в защищенный столбец user_id? Должен ли я получить последнюю строку и обновить идентификатор пользователя в качестве второй операции?

Спасибо за помощь, это очень ценно.

5
Aurora Vollvik 17 Апр 2016 в 18:34

2 ответа

Лучший ответ

ЕСЛИ у вас нет атрибута в $fillable, это не значит, что вы не можете его заполнить.

Свойство $fillable содержит атрибуты, которые можно заполнить с помощью метода create() или fill(), но вы все равно можете установить значение для любых атрибутов, используя доступ к свойству.

Итак, предположим, что у вас есть Модель со свойствами email, something и else. Вы устанавливаете $fillable так:

protected $fillable = ['email', 'something'];

Теперь предположим, что у вас есть такие данные:

$data = [
  'email' => 'sample@example.com',
  'something' => 'foo',
  'else' => 'bar',
];

Так что теперь, когда вы используете:

Model::create($data);

Вы заполните только email и something, потому что они находятся в $fillable и else не будут заполнены, потому что это не так, но вы всегда можете сделать что-то вроде этого:

$model = new Model($data);
$model->else = 'bar';
$model->save();

Поэтому вы можете установить здесь значение свойства else, даже если оно не внутри $fillable, но вам нужно получить к нему доступ как к обычному свойству.

13
Marcin Nabiałek 17 Апр 2016 в 17:29

Хотя это не совсем метод create(), вы можете использовать forceCreate() - работает в версии 5.5, хотя не требует документации.

-2
Michał 17 Янв 2018 в 22:50