是否可以在没有命令的情况下迁移迁移? (如果没有,我该如何解决)

时间:2019-02-01 10:40:27

标签: php database laravel migration schema

对我来说,描述我的问题的最佳方法是该链接;

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 :(得分:2)

  • 您的架构不正确。您不能让表相互依赖,也就是说,它们不能同时成为彼此的主从。这样,您根本无法制作它们。

  • 您应该首先创建主表,例如ABC

架构A:

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

架构B:

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

架构C:

$table->increments('id');
// some other columns
  • 现在,创建子表,换句话说,这些是描述many-to-many关系的中间表,您可以使用 pivot 属性访问它们。

架构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');
  • 现在,您可以按此顺序成功运行迁移,您应该一切顺利。

答案 1 :(得分:0)

在Laravel> = 5.0 中,实现此目标的一种方法是在正确命名的迁移文件夹中包含某些脚本。就像我以前在Sprint中进行迁移一样。

--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系统以编写自己的迁移命令,该命令将遍历migrations文件夹下的所有文件夹,为您创建并运行这些命令。

如果您不想通过artisan进行操作,也可以直接编写一个shell脚本