#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);