新しいウェブサイトを始めたばかりで、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'
)
);
}
}
これを私のチームクラスとして:
<?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
コンストラクターをすべて一緒に削除するだけで、シーダーは期待どおりに機能します。コンストラクターで何が間違っているのですか?
Eloquent
クラスのコンストラクターを見ると、ここで動作させるにはparent::__construct
を呼び出す必要があります。
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
メソッドが呼び出され、booted
プロパティが設定されます。私はこれが何をしているのか本当にわかりませんが、あなたの問題に応じてそれは関連しているようです:P
コンストラクターをリファクタリングしてattributes
配列を取得し、それを親コンストラクターに配置します。
更新
必要なコードは次のとおりです。
class MyModel extends Eloquent {
public function __construct($attributes = array()) {
parent::__construct($attributes); // Eloquent
// Your construct code.
}
}
laravel 3)では、2番目のパラメーター '$ 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...
}