如果您看到我对关于模型事件和观察者的原始问题的回答,这也应该从本质上解决这个问题:Multi tenancy in Laravel Eloquent ORM
所有 Eloquent 关系方法:附加、关联等...都触发相应的模型事件,详见此处:http://laravel.com/docs/5.0/eloquent#model-events
如果您设置一个模型观察器来操作在保存特定模型之前和之后使用的连接,那么您的所有关系调用都会自动正确设置数据库连接。
希望对你有帮助
-- 根据评论进行编辑
你好,玉伦,
抱歉,我把你的配件电话误认为是助理。 (保存关系)
但是,在定义了您的关系时,您应该能够获得类似的结果。见下例:
class ProductModel extends Eloquent {
protected $table = 'products';
protected $connection;
protected $databases = [
'default' => 'mysql-key1',
'products' => 'mysql-key2'
];
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
public function accessories()
{
$this->connection->reconnect($this->databases['products']);
$accessories = $this->hasMany('AccessoriesModel');
$this->connection->reconnect($this->databases['default']);
return $accessories;
}
}
然后您可以通过创建一个所有受影响的模型都可以扩展的抽象类来更进一步,例如:
abstract class DatabaseModel extends Eloquent {
protected $connection;
protected $databases = [
'default' => 'mysql-key1',
'products' => 'mysql-key2'
];
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
protected function setProductsDatabase()
{
$this->connection->reconnect($this->databases['products']);
}
protected function resetDatabaseConnection()
{
$this->connection->reconnect($this->databases['default']);
}
}
class ProductModel extends DatabaseModel {
protected $table = 'products';
public function accessories()
{
$this->setProductsDatabase();
$accessories = $this->hasMany('AccessoriesModel');
$this->resetDatabaseConnection();
return $accessories;
}
}
这样,只要您的关系配置正确,一切都会“自然”地运行,无需任何额外的代码。
一个更简洁但更复杂的解决方案是,您可以触发您自己的“检索”事件,而不是在模型中操作数据库,然后您可以为您的自定义“检索”事件添加一个事件处理程序到模型观察器 -这将是我的偏好,您可以在此处找到有关如何操作的更多信息:http://laravel.io/forum/05-24-2014-how-could-i-create-custom-model-events?page=1
希望对你有帮助