Метод заполнения в Laravel не работает?

#php #laravel

#php #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. Вы можете попробовать использовать $event->fill(array('foo' => '', 'bar' =>'' )) . и использовать var_dump вместо print_r

2. Не работает, но спасибо @LLL!

3. Вы хотите распечатать данные хранилища? Потому что я нашел применение save() после fill() . Я ссылаюсь на этот сайт jasonlewis.me/article/laravel-and-eloquent-part-1-basics

Ответ №1:

Атрибуты являются защищенным свойством. Используйте метод $obj->GetAttributes().

На самом деле. сначала вы должны изменить имя модели с Event на что-то другое, Laravel имеет Facade класс, IlluminateSupportFacadesEvent так что это может быть проблемой.

Что касается fill метода, вы должны передать ассоциативный массив fill методу, например:

 $obj = new MyModel;
$obj->fill(array('fieldname1' => 'value', 'fieldname2' => 'value'));
 

Также убедитесь, что у вас есть protected $fillable свойство (проверьте массовое присвоение), объявленное в вашем 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 или $guarded не определено в вашей модели, fill() не будет устанавливать никаких значений. Это делается для предотвращения массового присвоения модели. Смотрите «Массовое назначение» в документах Laravel Eloquent: http://laravel.com/docs/5.1/eloquent .

При заполнении атрибутов обязательно используйте ассоциативный массив:

 $event->fill(array('field1' => 'val1', 'field2' => 'val2'));
 

Полезный способ отладки и проверки всех ваших значений:

 //This will var_dump the variable's data and exit the function so no other code is executed
dd($event);
 

Надеюсь, это поможет!

Ответ №3:

Используйте массив ключей / значений в fill:

Пример:

 $book->fill(array(
    'title'  => 'A title',
    'author' => 'An author'
));
 

Ответ №4:

В вашей модели вам нужно иметь 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);