Неверное имя объекта со связями «многие ко многим» с двумя подключениями к БД - PullRequest
0 голосов
/ 01 февраля 2020

Я создаю учебное веб-приложение для отслеживания ассоциированного обучения и сертификации. Я создал модель Associate, которая использовала подключение вторичной БД к другой базе данных, чья информация была сгенерирована другим приложением, поэтому я не контролирую структуру данных. Таблица партнеров использует номер сотрудника в качестве первичного ключа, а не идентификатор с автоматическим увеличением. Я создал таблицу, чтобы отслеживать каждый проходящий курс обучения / сертификации. Я создал связь «многие ко многим» между сотрудником и курсом, но при попытке добавить запись в сводную таблицу я запускаю ошибку.

"SQLSTATE [42S02]: [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер] Недопустимое имя объекта 'associate_course'. ((SQL: вставить в [associate_course] ([associate_id], [course_id], [made_at], [updated_at]) ) значения (0000, 1, 2020-01-31 18: 36: 56.390, 2020-01-31 18: 36: 56.390)) ",

Вот функция, которая вызывается для создания запись в сводной таблице (где происходит ошибка)

 public function trained(Course $course, Request $request) {

        $request->validate([
            'associates' => 'required'
        ]);

        $associates = explode(',', $request->associates);

        foreach($associates as $associate_number) {
            $associate = Associate::where('NUMBER', $associate_number)->first();

            $course->associates()->attach($associate);
        } 
    }

Вот моя модель Associate

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Associate extends Model
{
    protected $connection = 'SHOPFLOOR';
    protected $table = 'USERS';

    public function getRouteKeyName()
    {
        return 'NUMBER';
    }

    public function courses()
    {
        return $this->belongsToMany(Course::class, 'associate_course', 'associate_id', 'course_id', 'NUMBER', 'id')->withTimestamps();
    }
}

, а вот моя модель курса

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Course extends Model
{
    protected $fillable = ['course_type_id', 'name', 'date', 'expires', 'expires_at', 'notification_threshold'];

    public function type() {
        return $this->belongsTo(CourseType::class);
    }

    public function associates() {
        return $this->belongsToMany(Associate::class, 'associate_course', 'course_id', 'associate_id', 'id', 'NUMBER')->withTimestamps();
    }
}

Я попытался скопировать sql из сообщения об ошибке и запустить его в базе данных, и он действительно вставил строку в базу данных, что заставило меня поверить, что это что-то с моей Laravel конфигурацией?

Могу ли я получить некоторые помощь в устранении этой проблемы?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Ошибка с драйвером Laravel sqlsrv. Мне нужно было указать полную схему, чтобы она заработала. В моем случае это был TRAINING.dbo.associate_course.

Так что отношения выглядят так:

Associate. php

public function courses()
    {
        return $this->belongsToMany(Course::class, 'TRAINING.dbo.associate_course', 'associate_id', 'course_id', 'NUMBER', 'id')->withTimestamps();
    }

Course. php

public function associates() {
        return $this->belongsToMany(Associate::class, 'TRAINING.dbo.associate_course', 'course_id', 'associate_id', 'id', 'NUMBER')->withTimestamps();
    }
0 голосов
/ 01 февраля 2020

Трудно сказать, не видя структуру вашей БД. Ошибка ясно говорит, что таблица, указанная в запросе, не найдена. Скорее всего, вы забыли указать схему в заявлении. Код IMHO, который вы показали, на самом деле не имеет отношения к проблеме.

...