2015-03-01 2 views
0

я установил мою модель Laravel атрибут охранял массив, теперь, конечно, я не могу установитьLaravel работа безопасно с массовыми заданиями

Model::create(['gaurded_field' => 'value']); 

Но как я могу вставить это безопасно, единственный вариант, который приходит на ум, чтобы создать первый, а затем сделать:

$model_object = Model::create(['other_attributes' => 'other_values']); 
$model_object->gaurded_field = 'value'; 
$model_object->save(); 

но только требует 2 запросов к базе данных, 1 вставка обновления 1, можно установить их в 1 запрос?

+1

Пожалуйста, объясните, почему вы не можете сделать 'Model :: create (['field' => 'value ']); 'после того, как вы установили' $ fillable' на 'Model'? – user2094178

+0

@ user2094178, если вы установите атрибуты fillable/protected, вы не можете отправить их в метод create ... потому что вам необходимо защитить их от сохранения с пользовательского ввода в первую очередь. – Amin

ответ

2

Что вы можете сделать, это:

$model_object = Model::fill(['other_attributes' => 'other_values']);  
$model_object->guarded_field = 'value'; 
$model_object->save(); 

EDIT

Существует еще одна вещь. Если при использовании магазина/обновления вы справляетесь атрибутом в коде, вы можете смело добавить его в заполняемые атрибуты (вам не нужно использовать его в охраняемых.

$input = $request->input(); 
$input['guarded_field'] = 'value'; 
$model_object = Model::create($input); 

Таким образом, вы можете смело добавить guarded_field в заполняемом потому что в вашем коде вы всегда перезаписываете его своим значением. Поэтому независимо от того, какой пользователь будет отправлять, вы всегда будете устанавливать свое собственное значение. Конечно, вам нужно сделать то же самое для обновления (или просто отключить значение пользователя для обновления, если вы Не нужно делать какие-либо изменения). Иногда это может быть удобно, но вам нужно быть очень осторожным с этой техникой.

+0

Большое вам спасибо, я сделал то, что вы предлагали в первой части, все хорошо, я бы предпочел не пойти со вторым предложением только потому, что иногда вы можете забыть. FYI 'Model :: fill()', это не статическая функция, просто создайте экземпляр модели, а затем используйте его. – Amin