Метод заполнения в Laravel не работает?
Я изучаю, как использовать структуру Laravel, но у меня возникают проблемы с заполнением модели. Вот мой код:
Модель Event
:
<?php
class Event extends Eloquent {
//Some functions not used yet
}
И вот код в контроллере:
$event = new Event();
$event->fill(array('foo', 'bar'));
print_r($event->attributes);
Итак, почему print_r
отображает пустой массив?
Ответы
Ответ 1
атрибуты - это защищенное свойство. Используйте метод $obj- > getAttributes().
На самом деле. сначала вы должны изменить название модели от Event
на что-то еще, Laravel
имеет класс Facade
как Illuminate\Support\Facades\Event
, поэтому это может быть проблемой.
Что касается метода fill
, вы должны передать ассоциативный массив методу fill
, например:
$obj = new MyModel;
$obj->fill(array('fieldname1' => 'value', 'fieldname2' => 'value'));
Также убедитесь, что у вас есть protected $fillable
(check mass assign) свойство, объявленное в вашем Model
с именами свойств, которым разрешено быть заполненным. Вы также можете сделать то же самое при инициализации Model
:
$properties = array('fieldname1' => 'value', 'fieldname2' => 'value');
$obj = new ModelName($properties);
Наконец, вызовите:
// Instead of attributes
dd($obj->getAttributes());
Потому что attributes
является защищенным свойством.
Ответ 2
Также убедитесь, что свойство $fillable определено в вашем классе модели. Например, в вашей новой переименованной модели:
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['field1', 'field2'];
Если у вас нет либо $fillable, либо $protected, определенных в вашей модели, fill() не будет устанавливать никаких значений. Это делается для того, чтобы модель не была распределена по массе. См. "Массовое присвоение" в документах Laravel Eloquent: http://laravel.com/docs/5.1/eloquent.
При заполнении атрибутов обязательно используйте ассоциативный массив:
$event->fill(array('field1' => 'val1', 'field2' => 'val2'));
Полезный способ отладки и проверки всех ваших значений:
//This will var_dump the variable data and exit the function so no other code is executed
dd($event);
Надеюсь, это поможет!
Ответ 3
Используйте массив key/value в fill:
Пример:
$book->fill(array(
'title' => 'A title',
'author' => 'An author'
));
Ответ 4
В Laravel 5.x,
Когда вы хотите создать новую строку:
$model = App\ModelName::create($arr);
Когда вы хотите обновить существующую строку:
$model = App\ModelName::find($id);
$model->fill($arr);
Все допустимые атрибуты существуют в переменной модели $fillable
.
Ответ 5
В вашей модели вы должны иметь protected $fillable = ['foo','bar']
;
Тогда вы можете сделать:
$event = new Event(array('foo' => "foo", "bar" => "bar"));
$event->save(); // Save to database and return back the event
dd($event);
Ключ массива должен быть в $fillable
, как Laravel будет эффективно вызывать:
foreach ($array as $key => $value){
$event->$key = $value;
}
Кроме того, вы можете написать непосредственно в имя столбца:
$event = new Event();
$event->foo = "foo";
$event->bar = "bar";
$event->save();
dd($event);