通过与不同服务器的多个数据库连接访问多对多关系的关系数据

Access relational data of many to many relationship with multiple database connection with different server

我在不同的服务器上使用多个数据库连接。即 host1host2。我的默认数据库连接是 host2。我的项目有两个 table。 users 存在于主机 1 上,tasks 存在于主机 2.

两个 table 都存在 many to many 关系。此关系的枢轴 table 是存在于 host2.

上的 task_users

我的模型文件在这里。

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');
    }
}

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

Base table or view not found: 1146 Table 'database_hosted_on_host1_server.task_users' doesn't exist.

这是我的控制器代码

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

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

我也试过 laravel documentation 定义自定义中间 Table 模型。但仍然出现错误。我想我在 pivot class.

中犯了一些错误

这是我的代码。

Task.php

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

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

任务User.php

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

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

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

Base table or view not found: 1146 Table 'database_hosted_on_host1_server.task_user' doesn't exist.

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

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

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

User.php

class User extends Authenticatable
{

    protected $table = 'host1.users';

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

Task.php

class Task extend Model
{
    protected $table = 'host2.tasks';

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

还有你的关键任务User.php

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

好的。我从 themsaid on github. He said that many to many relationships on different connections would work in 1 direction only but not the other. Here you can find github issue.

那里得到了答案