Php 在添加外部id i';我得到:';无法打开引用的表';
在我的迁移文件夹中,第一个迁移文件是:Php 在添加外部id i';我得到:';无法打开引用的表';,php,laravel,Php,Laravel,在我的迁移文件夹中,第一个迁移文件是: 2014_10_11_000000_create_user_properties_table 2014_10_12_000000_create_users_table 我把这个模式融入其中: Schema::create('user_properties',函数(Blueprint$表){ $table->id(); $table->foreigned('user_id')->constrained()->nullable()->onDelete('c
2014_10_11_000000_create_user_properties_table
2014_10_12_000000_create_users_table
我把这个模式
融入其中:
Schema::create('user_properties',函数(Blueprint$表){
$table->id();
$table->foreigned('user_id')->constrained()->nullable()->onDelete('cascade');
$table->mediumText('province')->nullable();
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
第二个迁移文件是:
2014_10_11_000000_create_user_properties_table
2014_10_12_000000_create_users_table
我也将这个模式
融入其中:
Schema::create('users',函数(Blueprint$表){
$table->id();
$table->foreigned('user_id')->constrated()->nullable();
/*$table->foreigned('properties_id')->constrated('user_properties')->nullable()*/
$table->boolean('active')->默认值(0);
$table->string('name')->nullable();
$table->string('family')->nullable();
$table->string('username')->unique();
///...
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
现在,当我取消这一行的注释时:
$table->foreigned('properties_id')->constrated('user_properties')->nullable();
这进入了用户
模式,我尝试运行迁移命令时出现以下错误:
SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'users' (SQL: alter table `user_properties` add constraint `user_properties_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)
首先,您试图在
用户属性
迁移文件中引用用户
表,而实际上用户
表还不存在。
第二个原理图问题是迁移文件的时间戳。Laravel按字母顺序引用迁移文件,并将尝试在用户的迁移之前执行用户属性迁移
据我所知,您正试图在用户和用户属性之间创建一对多关系。在这种情况下,我认为正确的流程应该是这样的-
php artisan make:迁移创建用户表
在create_users_表迁移文件中,您的方案不应包含任何外来ID-
php artisan迁移
php-artisan-make:migration-create\u-user\u-properties\u-table
在create_user_properties_表迁移文件中,您应该输入以下内容-
php artisan再次迁移
如果您想强调laravel雄辩的方法,并以类似$user->property->province
的简单方式访问用户的属性,那么您也应该在他们的模型之间建立关系
在User.php中(我猜它位于App/Models/User.php或您为模型选择的任何其他路径上),您应该添加此方法-
public function property()
{
return $this->hasMany(UserProperties::class);
}
在UserProperties.php中,您应该添加
public function user() {
return $this->belongsTo(User::class);
}
因此,如果您有一些特定的属性想要检索它的“用户”,那么它也将非常简单和容易接近。首先,您尝试在用户属性
迁移文件中引用用户
表,而实际上用户
表还不存在。
第二个原理图问题是迁移文件的时间戳。Laravel按字母顺序引用迁移文件,并将尝试在用户的迁移之前执行用户属性迁移
据我所知,您正试图在用户和用户属性之间创建一对多关系。在这种情况下,我认为正确的流程应该是这样的-
php artisan make:迁移创建用户表
在create_users_表迁移文件中,您的方案不应包含任何外来ID-
php artisan迁移
php-artisan-make:migration-create\u-user\u-properties\u-table
在create_user_properties_表迁移文件中,您应该输入以下内容-
php artisan再次迁移
如果您想强调laravel雄辩的方法,并以类似$user->property->province
的简单方式访问用户的属性,那么您也应该在他们的模型之间建立关系
在User.php中(我猜它位于App/Models/User.php或您为模型选择的任何其他路径上),您应该添加此方法-
public function property()
{
return $this->hasMany(UserProperties::class);
}
在UserProperties.php中,您应该添加
public function user() {
return $this->belongsTo(User::class);
}
因此,如果您有一些特定的属性想要检索它的“用户”,那么它也将非常简单和容易接近。当您尝试创建用户
模式时,可能还没有创建您的参考模式。看看这个,它可能会解决您的问题当您试图创建用户
模式时,可能还没有创建您的参考模式。看看这个,它可能会解决您的问题。问题:
在两个表相互引用的情况下,在创建表时不能使用外键。因为,当您试图引用尚未创建的表时,将出现错误
解决方案:
要解决此问题,您可以生成4个迁移文件:2个用于创建表的文件,2个用于添加外键的文件:
创建第一个表,但不使用任何外键
您可以创建第二个表,但不使用任何外键
您只为第一个表添加外键
您只为第二个表添加外键
问题:
在两个表相互引用的情况下,在创建表时不能使用外键。因为,当您试图引用尚未创建的表时,将出现错误
解决方案:
要解决这个问题,您可以