扩展Eloquent的类的构造函数

时间:2013-06-03 00:43:11

标签: php laravel laravel-4 eloquent seeding

我刚开始一个新网站,我想利用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

只需将构造函数一起移除,就可以使播种机按预期工作。究竟我在构造函数中做错了什么?

3 个答案:

答案 0 :(得分:26)

如果你看一下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方法并设置booted属性。我真的不知道这是做什么的,但根据你的问题似乎相关:P

重构构造函数以获取attributes数组并将其放入父构造函数。

<强>更新

以下是所需代码:

class MyModel extends Eloquent {
    public function __construct($attributes = array())  {
        parent::__construct($attributes); // Eloquent
        // Your construct code.
    }
}

答案 1 :(得分:1)

在laravel 3中,您必须输入第二个参数&#39; $ exists&#39;默认值 &#34;假&#34;

class Model extends Eloquent {

    public function __construct($attr = array(), $exists = false) {
        parent::__construct($attr, $exists);
       //other sentences...
    }
}

答案 2 :(得分:0)

您可以使用此通用方法来传递参数。

/**
* 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...    
}