19

我刚创建了一个新网站,我想使用 Eloquent。在为我的数据库播种的过程中,我注意到如果我在扩展 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

只需将构造函数全部移除,就可以让播种机按预期工作。我对构造函数到底做错了什么?

4

4 回答 4

30

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.
    }
}
于 2013-06-03T05:27:41.153 回答
1

在 laravel 3 中,您必须将第二个参数 '$exists' 设置为默认值“false”。

class Model extends Eloquent {

    public function __construct($attr = array(), $exists = false) {
        parent::__construct($attr, $exists);
       //other sentences...
    }
}
于 2014-07-01T11:13:53.200 回答
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...    
}
于 2017-04-27T08:27:26.870 回答
0

我遇到了同样的问题,我用构造函数解决了传递参数的问题。

class MyModel extends Model
{
    public function __construct(array $attributes = []) {
        parent::__construct($attributes);

        // ...
    }
 }

然后像普通班一样打电话,

$result = (new MyModel($request->all()))->create($request->all());
于 2022-02-21T15:47:19.810 回答