我们知道,要动态改变 Eloquent Model 的表名可以使用 setTable 方法:
$model = new MyLog();
$model->setTable('log_20170123');
echo $model->getTable(); // my_log
但是在 setTable 之后使用 create 插入数据,使用的还是原来的表:
$model = new MyLog();
$model->setTable('log_20170123');
echo $model->create($data); // insert into `my_log`...
来看看 setTable 的源码:
abstract class Model implements ArrayAccess...
{
/**
* Set the table associated with the model.
*
* @param string $table
* @return $this
*/
public function setTable($table)
{
$this->table = $table;
return $this;
}
它设置的是 Model 类的表名。
再来看看 create 方法:
/**
* Save a new model and return the instance.
*
* @param array $attributes
* @return static
*/
public static function create(array $attributes = [])
{
$model = new static($attributes);
$model->save();
return $model;
}
注意,这里 new 的是 static 关键字。自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 这里不做详细说明,具体参考:后期静态绑定。
也就是说 create 的时候并没有进行修改表名的操作,而实例化的是你继承了 Model 类的子类的类名。
那么怎么解决呢?
$model = new MyLog($data);
$model->setTable($your_table_name);
$model->save();
即可!