Multi tenancy in Laravel Eloquent ORM

后端 未结 2 427
耶瑟儿~
耶瑟儿~ 2020-12-22 05:51

This is sort of a follow up question from

Forcing Eloquent models to re resolve database connection

With multiple database connections :

re         


        
2条回答
  •  独厮守ぢ
    2020-12-22 06:32

    The problem is that setConnection() works on an instance of a class, but the create() method is a static method on the class itself. In your repository, $this->product is an instance of the Product class. Using setConnection() on this instance before doing queries will work fine, but you'll need to do a little more manual work if you want to use separate connections on the static methods (such as create()).

    All the create() method does is instantiate a new instance with the given attributes and then call save(). So, instead of calling create() on the Product model, you'll just need to do this manually:

    class ProductRepository {
        public function create(array $attributes, $connection = null) {
            $product = $this->product->newInstance($attributes);
            $product->setConnection($connection ?: $this->product->getConnectionName());
            $product->save();
            return $product;
        }
    }
    

    You could also override the static create() method on the Product model to accept a connection, as well.

    class Product extends Model {
        public static function create(array $attributes, $connection = null) {
            $model = new static($attributes);
            $model->setConnection($connection ?: $this->connection);
            $model->save();
            return $model;
        }
    }
    
    class ProductRepository {
        public function create(array $attributes, $connection = null) {
            $connection = $connection ?: $this->product->getConnectionName()
            return $this->product->create($attributes, $connection);
        }
    }
    

提交回复
热议问题