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个用于添加外键的文件:

  • 创建第一个表,但不使用任何外键
  • 您可以创建第二个表,但不使用任何外键
  • 您只为第一个表添加外键
  • 您只为第二个表添加外键

  • 问题:

    在两个表相互引用的情况下,在创建表时不能使用外键。因为,当您试图引用尚未创建的表时,将出现错误

    解决方案:
    要解决这个问题,您可以