通过与不同服务器的多个数据库连接访问多对多关系的关系数据
Access relational data of many to many relationship with multiple database connection with different server
我在不同的服务器上使用多个数据库连接。即 host1
和 host2
。我的默认数据库连接是 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.
那里得到了答案
我在不同的服务器上使用多个数据库连接。即 host1
和 host2
。我的默认数据库连接是 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.
那里得到了答案