我有一个带构造函数的Eloquent模型(如下),它采用$type
参数。类型是 - 比方说 - first
,second
或third
。
<?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上。
答案 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' );
}
}
?>