【问题标题】:Access relational data of many to many relationship with multiple database connection with different server通过与不同服务器的多个数据库连接访问多对多关系的关系数据
【发布时间】:2017-08-19 05:34:29
【问题描述】:

我正在不同服务器上处理多个数据库连接。即host1 和host2。我的默认数据库连接是 host2。我的项目有两张桌子。 users 存在于 host1 和 tasks 存在于 host2。

两个表上都有many to many 关系。此关系的数据透视表是 task_users,存在于 host2 上。

我的模型文件在这里。

User.php

class User extends Authenticatable
{

    protected $connection = 'host1';

    public function tasks()
    {
        return $this->belongsToMany(Task::class, 'task_users', 'user_id', 'task_id');
    }
}

Task.php

class Task extends Model
{
    protected $connection = 'host2';

    public function users()
    {
        return $this->belongsToMany(User::class, 'task_users', 'task_id', 'user_id');
    }
}

使用此模型文件,当我尝试获取任务的用户时,我会收到此错误。

未找到基表或视图:1146 表 'database_hosted_on_host1_server.task_users' 不存在。

这是我的控制器代码

$task = Task::find($taskId);
dd($task->users->toArray());

我也试过this。但它只有在两个数据库都在同一台服务器上时才有效。

我也尝试过从laravel documentation定义自定义中间表模型。但仍然出现错误。我想我在数据透视类中犯了一些错误。

这是我的代码。

Task.php

class Task extend Model
{
    protected $connection = 'host2';

    public function users()
    {
        return $this->belongsToMany(User::class)->using(TaskUser::class);
    }
}

TaskUser.php

使用 Illuminate\Database\Eloquent\Relations\Pivot;

class TaskUser extends Pivot
{
    protected $connection = 'host2';
    protected $table = 'task_users';
}

使用此代码,当我尝试获取任务的用户时,我会收到此错误。

未找到基表或视图:1146 表 'database_hosted_on_host1_server.task_user' 不存在。

在这两个代码中,关系表都被分配了 host1 连接(相关表的连接,即用户)。但它存在于host2连接中。而且我的默认连接是host2。

我几乎花了太多时间来解决这个问题。但是没有办法。如果有人知道答案,将不胜感激。

【问题讨论】:

    标签: laravel laravel-5 many-to-many laravel-5.4 laravel-eloquent


    【解决方案1】:

    在您的模型上,尝试像这样定义“connection.table”:

    用户.php

    class User extends Authenticatable
    {
    
        protected $table = 'host1.users';
    
        public function tasks()
        {
            return $this->belongsToMany(Task::class, 'task_users', 'user_id', 'task_id');
        }
    }
    

    任务.php

    class Task extend Model
    {
        protected $table = 'host2.tasks';
    
        public function users()
        {
            return $this->belongsToMany(User::class)->using(TaskUser::class);
        }
    }
    

    还有你的枢纽TaskUser.php

    class TaskUser extends Pivot
    {
        protected $table = 'host2.task_users';
    }
    

    【讨论】:

    • 如果我按照您的回答进行更改,我会收到此错误。 Base table or view not found: 1146 Table 'host2.tasks' doesn't exist
    • 你测试过你的数据库连接吗?
    • 我已经测试了我的数据库连接。两者都已连接。
    【解决方案2】:

    好的。我从 github 上的themsaid 得到了答案。他说,不同连接上的多对多关系只会在一个方向上起作用,而不是在另一个方向上起作用。在这里你可以找到github issue。

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 2020-10-16
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2012-12-26
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多