Я только что начал новый сайт, и я хотел использовать Eloquent. В процессе посева моей базы данных я заметил, что я получаю пустые строки, добавленные, если бы включил в модель какой-либо конструктор, который расширяет красноречивость. Например, запуск этой сеялки:
<?php class TeamTableSeeder extends Seeder { public function run() { DB::table('tm_team')->delete(); Team::create(array( 'city' => 'Minneapolis', 'state' => 'MN', 'country' => 'USA', 'name' => 'Twins' ) ); Team::create(array( 'city' => 'Detroit', 'state' => 'MI', 'country' => 'USA', 'name' => 'Tigers' ) ); } }
С этим, как с моим классом Team:
<?php class Team extends Eloquent { protected $table = 'tm_team'; protected $primaryKey = 'team_id'; public function Team(){ // null } }
Допускается:
team_id | city | state | country | name | created_at | updated_at | deleted_at 1 | | | | | 2013-06-02 00:29:31 | 2013-06-02 00:29:31 | NULL 2 | | | | | 2013-06-02 00:29:31 | 2013-06-02 00:29:31 | NULL
Простое удаление конструктора вместе позволяет сеялке работать должным образом. Что именно я делаю неправильно с конструктором?
Вы должны вызвать parent::__construct
чтобы заставить все работать здесь, если вы посмотрите на конструктор класса Eloquent
:
public function __construct(array $attributes = array()) { if ( ! isset(static::$booted[get_class($this)])) { static::boot(); static::$booted[get_class($this)] = true; } $this->fill($attributes); }
boot
метод boot
и устанавливается booted
свойство. Я действительно не знаю, что это делает, но в зависимости от вашей проблемы кажется актуальным: P
Рефакторируйте свой конструктор, чтобы получить массив attributes
и поместите его в родительский конструктор.
Обновить
Вот нужный код:
class MyModel extends Eloquent { public function __construct($attributes = array()) { parent::__construct($attributes); // Eloquent // Your construct code. } }
В laravel 3 вы должны поместить второй параметр «$ exists» со значением по умолчанию «false».
class Model extends Eloquent { public function __construct($attr = array(), $exists = false) { parent::__construct($attr, $exists); //other sentences... } }
Вы можете использовать этот общий метод, который также позволяет передавать параметр.
/** * Overload model constructor. * * $value sets a Team's value (Optional) */ public function __construct($value = null, array $attributes = array()) { parent::__construct($attributes); $this->value = $value; // Do other staff... }