Можно ли мигрировать миграции без заказа?(Если нет, как я могу это исправить) - PullRequest
0 голосов
/ 01 февраля 2019

Лучший способ описать мою проблему и ее решение - это ссылка;

StackOverflow

Моя проблема именно такова, и ее решениена самом деле работает, но не в моем случае, либо у меня будет альтернативное решение для моего, либо я делаю что-то не так с моим конструктором схем, и мне нужно лучше понять его.

Мой код в основном похож наэто:

//just an example, not my code

Schema A (as)

//other code, such as table->increments('id')

$table->unsignedInteger('b_id');
$table->unsignedInteger('c_id');

$table->foreign('b_id')->references('id')->on('bs'); 
$table->foreign('c_id')->references('id')->on('cs');


Schema B (bs)

$table->unsignedInteger('a_id');
$table->unsignedInteger('c_id');

$table->foreign('a_id')->references('id')->on('as'); 
$table->foreign('c_id')->references('id')->on('cs');


Schema C (cs)

$table->unsignedInteger('a_id');
$table->unsignedInteger('b_id');

$table->foreign('a_id')->references('id')->on('as'); 
$table->foreign('b_id')->references('id')->on('bs');

Так что ни один из заказов не помогает мне с этим решением.

Есть ли решение для моего случая, или моя логика кода / схемы неверна, и мне нужно изменить свой код?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019
  • Ваша схема неверна.Вы не можете иметь взаимозависимые таблицы, т. Е. Они не могут быть одновременно и главными, и подчиненными.Таким образом, вы никогда не сможете сделать их вообще.

  • Сначала вы должны создать мастер-таблицы, скажем, A, B, C.

Схема A:

$table->increments('id');
// some other columns

Схема B:

$table->increments('id');
// some other columns

Схема C:

$table->increments('id');
// some other columns
  • Теперь создайте дочерние таблицы, другими словами, это промежуточные таблицы, описывающие отношения многие-ко-многим , и вы можете получить к ним доступ, используя pivot attribute.

Схема AS:

$table->unsignedInteger('b_id');
$table->unsignedInteger('c_id');

$table->foreign('b_id')->references('id')->on('B'); 
$table->foreign('c_id')->references('id')->on('C');

Схема BS:

$table->unsignedInteger('a_id');
$table->unsignedInteger('c_id');

$table->foreign('a_id')->references('id')->on('A'); 
$table->foreign('c_id')->references('id')->on('C');

Схема CS:

$table->unsignedInteger('a_id');
$table->unsignedInteger('b_id');

$table->foreign('a_id')->references('id')->on('A'); 
$table->foreign('b_id')->references('id')->on('B');
  • Теперь вы можете успешно запустить миграцию в этом порядке, и вам будет хорошо.
0 голосов
/ 01 февраля 2019

В Laravel> = 5.0 , один из способов добиться этого - иметь определенные сценарии в папках миграции с правильными именами.Как я использую для миграции в Sprints.

--migrations/ ---Sprint8/ ------user_table.php ------car_table.php --Sprint9/ ------complaint_table.php ------supervisor_table.php

При таком подходе вы должны запустить команду миграции в каждой из ваших подпапок:

php artisan migrate --path=/database/migrations/Sprint8 php artisan migrate --path=/database/migrations/Sprint9

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

Вы также можете просто написать сценарий оболочки, если вы не хотите заниматься этим с помощью artisan

...