php - Laravel Eloquent ORM 中的 Multi-Tenancy 关系

标签 php database laravel eloquent relationship

这又是一个跟进问题:

Multi tenancy in Laravel Eloquent ORM

这一次,我有关于在 Multi-Tenancy 环境中使用关系模型的问题。

给定一个产品模型:

class Product extends Eloquent {

public function accessories()
{
    return $this->belongsToMany('Accessory', 'product_accessory', 'product_id', 'accessory_id')
                ->withPivot('id')
                ->withTimestamps();
}

是否有任何简单的方法来确保关系方法 accessories() 使用正确的数据库连接?现在,当我执行这样的附加方法时:

$product->accessories()->attach($accessory->id, $attributes);

accessories 方法似乎指向不同于 $product 实体的另一个数据库。我相信这是因为在实例化关系时附件模型连接没有改变。

最佳答案

如果您看到我对您关于模型事件和观察者的原始问题的回答,这也应该从本质上解决这个问题:Multi tenancy in Laravel Eloquent ORM

所有 Eloquent 关系方法:附加、关联等...都会触发相应的模型事件,详见此处:http://laravel.com/docs/5.0/eloquent#model-events

如果您设置一个 Model Observer 来操作特定模型保存前后使用中的连接,您所有的关系调用都将自动适本地设置数据库连接。

希望对你有帮助

-- 编辑响应评论

嗨,宇伦,

抱歉,我把您的配件电话误认为是 associate。 (保存关系)

但是,在定义关系的情况下,您应该能够获得类似的结果。请参见以下示例:

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

希望对你有帮助

关于php - Laravel Eloquent ORM 中的 Multi-Tenancy 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29074615/

相关文章:

php - Netbeans:如何禁用这个烦人的警告?

php - Delete from inner join mysql查询-两表多条件

database - Web 应用程序的受限 PostgreSQL 权限

Laravel Forge 无法运行 sudo 命令

php - PHP header 中的数组在 WordPress 中不是全局的

php - 将自定义内容添加到 WooCommerce 产品描述

node.js - Mongoose :引用 "Schema.ObjectId"而不是直接使用模式名称之间的区别?

android - 适用于 Android 的 Actionscript : How to store "default data" in sql? 有什么意义?

javascript - Ajax 成功事件中显示 Laravel 验证错误

php - Laravel 查询生成器 - 从数据库中选择 Laravel 方式