Метод заполнения в 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);