podust
@podust

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

Допустим, имеется две таблицы — одна завязана на другую внешними ключами (foreign keys), и для того, чтобы создать запись в одной из таблиц, нужно ввести валидный ключ другой. Но в другой такого ключа нет, по понятным причинам - потому что, чтобы его создать, надо создать необходимый внешний ключ в первой. И так до бесконечности.

10cb7225359f412a86883c6097ebec8b.png

Laravel ругается и не позволяет создавать записи в таблицах при отсутствии правильного внешнего ключа, и это понятно. Также ругаются другие программы для работы с БД. И я в замешательстве.

Update: Видимо да, где-то есть лишняя связь и я не до конца понял принцип. Вот такую модель для Ларавела я придумал:

d52559be6633482b9597f5f1324b2e82.png

А вот так, видимо криво, реализовал в миграциях создание связей для таблиц (postals - таблица с данными об адресе заказа, они привязываются исключительно к product1s и product2s при их заказе):

Schema::table('payments', function ($table) {
	$table->foreign('user_id')->references('id')->on('users');
	$table->foreign('product1_id')->references('id')->on('product1s');
	$table->foreign('product2_id')->references('id')->on('product2s');
});

Schema::table('product1s', function ($table) {
	$table->foreign('user_id')->references('id')->on('users');
	$table->foreign('postal_id')->references('id')->on('postals');
	$table->foreign('payment_id')->references('id')->on('payments');
});

Schema::table('product2s', function ($table) {
	$table->foreign('user_id')->references('id')->on('users');
	$table->foreign('postal_id')->references('id')->on('postals');
	$table->foreign('payment_id')->references('id')->on('payments');
});

Schema::table('postals', function ($table) {
	$table->foreign('product1_id')->references('id')->on('product1s');
	$table->foreign('product2_id')->references('id')->on('product2s');
});
  • Вопрос задан
  • 2472 просмотра
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
Я правильно понял, зачем такое может понадобится - это связка MANY-MANY?
Если да - выбросьте двойную связку и желательно так не делайте. Вместо нее используйте дополнительную таблицу для связки. Например: есть 2 таблицы users[id, name] И groups[id, name]. Для них создайте еще одну groupsHasUsers[groupId, userId].
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Что-то не так у вас с архитектурой базы данных.... опишите задачу менее абстрактно. Кто с кем связан и как так вышло что у вас такая кривая структура базы?
Ответ написан
JhaoDa
@JhaoDa
LaravelRUS Team
Это противоречит основной цели внешних ключей — ссылочной целостности.
Возникает вопрос — а зачем такое может понадобиться?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы