Laravel syn c return SQLSTATE [42S22] - PullRequest
       2

Laravel syn c return SQLSTATE [42S22]

1 голос
/ 20 апреля 2020

Я пытаюсь сохранить идентификаторы 2 моделей с помощью метода syn c, но получаю эту ошибку:

сообщение: «SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец» cable_core_id 'в' списке полей '(SQL: вставить в closure_cores (cable_core_id, core_id) значения (20, 28)) "

Снимок экрана

Это это данные, которые я отправил на сервер

one

модели

TitikClosur

class TitikClosur extends Model
{
    public function cores(){
        return $this->belongsToMany(CableCore::class, 'closure_cores', 'core_id');
    }
}

CableCore

class CableCore extends Model
{
    public function closures(){
        return $this->belongsToMany(TitikClosur::class, 'closure_cores', 'closure_id');
    }
}

Контроллер

public function store(Request $request)
{
  $titik = new TitikClosur;
  //...
  $titik->save();
  $titik->cores()->sync($request->cores, false);
  return....
}

Схема

Так выглядит моя таблица для сохранения идентификаторов

public function up()
    {
        Schema::create('closure_cores', function (Blueprint $table) {
            $table->id();
            $table->foreignId('core_id');
            $table->foreignId('closure_id');
            $table->timestamps();
        });
        Schema::table('closure_cores', function (Blueprint $table) {
            $table->foreign('core_id')->references('id')->on('cable_cores')->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('closure_id')->references('id')->on('titik_closurs')->onUpdate('cascade')->onDelete('cascade');
        });
    }

Любая идея?

Обновление

Я изменил свои коды модели следующим образом:

TitikClosur

public function cores(){
        return $this->belongsToMany(CableCore::class, 'closure_cores', 'core_id', 'closure_id');
}

CableCore

public function closures(){
        return $this->belongsToMany(TitikClosur::class, 'closure_cores', 'closure_id', 'core_id');
}

Теперь я получаю эту ошибку

сообщение: «SQLSTATE [23000]: нарушение ограничения целостности: 1452 Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не удается (gis-web. closure_cores, CONSTRAINT closure_cores_core_id_foreign ИНОСТРАННЫЙ КЛЮЧ (core_id) ССЫЛКИ cable_cores (id)) (SQL : вставить в closure_cores (closure_id, core_id) значения (20, 34)) "

1 Ответ

3 голосов
/ 20 апреля 2020

Если не указано иное, laravel ожидает, что имя внешнего ключа в сводной таблице будет единственным числом в имени таблицы с _id, прикрепленным к концу. Вы допустили ошибку в своем заявлении об ответственности. Вы переключили ключи в своих двух утверждениях, отношение, возвращаемое cores (), считает, что core_id ссылается на id TitikClosur, и предполагает, что модель CableCore должна иметь ключ cable_core_id, но не может найти его в таблице. Кроме того, две функции отношения в двух моделях не имеют никакого способа обмена информацией. Так что на самом деле вы должны делать:

class TitikClosur extends Model
{
    public function cores(){
        return $this->belongsToMany(CableCore::class, 'closure_cores', 'closure_id', 'core_id');
    }
}

и

class CableCore extends Model
{
    public function closures(){
        return $this->belongsToMany(TitikClosur::class, 'closure_cores', 'core_id', 'closure_id');
    }
}

В ответ на ваше обновление:

Вторая ошибка обычно означает, что нет CableCore с id 34 в вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...