创建时间戳会在构造函数

时间:2015-07-17 08:49:48

标签: php laravel eloquent laravel-5

我有一个带构造函数的Eloquent模型(如下),它采用$type参数。类型是 - 比方说 - firstsecondthird

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model {

    protected $table; // Define $table field

    public function __construct($type = null, array $attributes = array()) {

        // Initialize $table field
        $this->table = isset($type) ? 'my_'.$type.'_table' : null;

        parent::__construct($attributes);
    }

?>

正如您在上面的代码中看到的,我将模型的$table属性设置为my_[type]_table,因此我可以使用3个表中的一个动态地使用该模型。像这样:

// Somewhere in controller
$type = 'first';
$myModel = new MyModel($type);
$myModel->create(.....); // <= Error is thrown here

问题是当Eloquent尝试为表创建时间戳时,它不再关心我在__construct()中设置的表名,它会尝试为表创建时间戳名为my_models(显然是基于模型的类名),而不是(在这种情况下)my_first_table

  

SQLSTATE [HY000]:一般错误:1没有这样的表:my_models(SQL:   插入“my_models”(“updated_at”,“created_at”)值   (2015-07-17 08:35:13,2015-07-17 08:35:13))

是否可以保留自动时间戳创建的动态表名?我在Laravel 5.1上。

2 个答案:

答案 0 :(得分:1)

当您调用 $ myModel-&gt; create()时,会创建一个新对象,并且不会将类型传递给其构造函数。

只需将$ type传递给 $ myModel-&gt; create()作为其中一个属性,即可更新构造函数:

public function __construct($attributes = array()) {
  if (array_key_exists('type', $attributes)) {
    $this->table = 'my_' . $attributes['type'] . '_model';
  }

  parent::__construct(array_except($attributes, 'type'));
}

它应该有用。

答案 1 :(得分:1)

有点晚了

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model {


    //-- using a mutator
    public function setTypeAttribute($type)
    {

        //-- set type =)
        $this->attributes['type'] = $type;

        //-- then use this type for your table name convention
        $this->setTable( 'my_'. $type .'_table' );

    }
}

?>