Нарушение ограничения целостности - 1452 Невозможно добавить или обновить дочернюю строку - PullRequest
1 голос
/ 15 апреля 2020

Я сталкиваюсь с проблемой отношения «многие ко многим», когда пытаюсь сохранить данные в промежуточную таблицу. По сути, клиент имеет много наблюдений, и у меня есть tbl_cients, clients_hasmany_observations и tbl_clients_observations.

Иностранные ключи в миграциях:

Schema::connection('dev')->table('clients_hasMany_observations', function (Blueprint $table) {
    $table->foreign('client_id')->references('client_id')->on('tbl_clients');
    $table->foreign('observation_id')->references('observation_id')->on('tbl_clients_observations');
});

Модель клиентов:

/**
 * The observations that belong to the client.
 */
public function observations()
{
    return $this->belongsToMany('App\ClientsObservations', 'clients_hasmany_observations', 'client_id', 'observation_id')->withTimestamps();
}

Модель наблюдений:

/**
 * The observations that belong to the client.
 */
public function clients()
{
    return $this->belongsToMany('App\Clients', 'clients_hasmany_observations', 'client_id', 'observation_id')->withTimestamps();
}

Принимая это, если я пытаюсь добавить нового клиента и прикрепить фиктивное наблюдение, я получаю ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (helderne_dev. clients_hasmany_observations, CONSTRAINT clients_hasmany_observations_observation_id_foreign FOREIGN KEY (observation_id) ССЫЛКИ tbl_clients_observations (observati) (SQL: insert into Clients_hasmany_observations ( client_id , create_at , наблюдение_id , updated_at`) значения (4, 2020-04-15 11:05:09, 50, 2020-04-15 11:05:09)) `` `

Я не могу понять почему, потому что я добавил ключи. Мы будем благодарны за любую помощь!

EDIT # 1 В контроллере, который я пишу,

$new_client = Clients::create($request->all());
$new_client->observations()->attach([50]);
dd($new_client);

50 будет возможным идентификатором наблюдения в tbl_clients_observations.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

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

DB::statement('SET FOREIGN_KEY_CHECKS=0');

Затем включите его снова

DB::statement('SET FOREIGN_KEY_CHECKS=1');

Это решит проблему

0 голосов
/ 15 апреля 2020

Метод присоединения не принимает массив (в отличие от аналогичного метода syn c). См. документацию для справки.

Попробуйте выполнить следующее:

$new_client->observations()->attach(50);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...