Laravel Eloquent setTable 无效的问题

我们知道,要动态改变 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();

即可!

你可能感兴趣的:(Laravel Eloquent setTable 无效的问题)