美文网首页
Laravel Eloquent setTable 无效的问题

Laravel Eloquent setTable 无效的问题

作者: 伍源辉 | 来源:发表于2017-01-23 16:20 被阅读1057次

    我们知道,要动态改变 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 无效的问题

          本文链接:https://www.haomeiwen.com/subject/tspabttx.html