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

时间:2017-08-19 05:34:30

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

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

两个表都有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。

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

2 个答案:

答案 0 :(得分:1)

在您的模型上,尝试定义' 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);
    }
}

你的角色TaskUser.php

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

答案 1 :(得分:0)

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