Доступ к реляционным данным многих ко многим отношениям с несколькими подключениями к базе данных с другим сервером

Я работаю с несколькими подключениями к базе данных на разных серверах. то есть host1 и host2. Мое подключение к базе данных по умолчанию — host2. В моем проекте две таблицы. users существует на хосте 1 и tasks существует на хосте 2.

В обеих таблицах существует отношение 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());

Я также пробовал это. Но это работает, только если обе базы данных находятся на одном сервере.

Я также пробовал Определение пользовательских моделей промежуточных таблиц из документация laravel. Но все еще получаю ошибку. Я думаю, что делаю какую-то ошибку в сводном классе.

Вот мой код.

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.

Я почти потратил слишком много времени, чтобы решить эту проблему. Но никак не получалось. Если кто знает ответ, буду признателен.


person Akshay Vaghasiya    schedule 19.08.2017    source источник


Ответы (2)


В вашей модели попробуйте определить «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');
    }
}

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';
}
person Diego Blaker    schedule 19.08.2017
comment
Я получаю эту ошибку, если вношу изменения в соответствии с вашим ответом. Base table or view not found: 1146 Table 'host2.tasks' doesn't exist - person Akshay Vaghasiya; 21.08.2017
comment
Вы проверяли соединения с базой данных? - person Diego Blaker; 21.08.2017
comment
Я проверил подключение к базе данных. Оба подключены. - person Akshay Vaghasiya; 22.08.2017

Хорошо. Я получил ответ от themsaid на github. Он сказал, что отношения «многие ко многим» на разных соединениях будут работать только в одном направлении, но не в другом. Здесь вы можете найти ошибку github.

person Akshay Vaghasiya    schedule 24.08.2017