我在不同服务器上使用多个数据库连接。即host1
和host2
。我的默认数据库连接是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。
我几乎花了太多时间来解决这个问题。但没有任何办法。如果有人知道答案,我们将不胜感激。
答案 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。