Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 5 Laravel 5雄辩的双向外键迁移_Laravel 5_Eloquent_Laravel Eloquent - Fatal编程技术网

Laravel 5 Laravel 5雄辩的双向外键迁移

Laravel 5 Laravel 5雄辩的双向外键迁移,laravel-5,eloquent,laravel-eloquent,Laravel 5,Eloquent,Laravel Eloquent,我有一个有趣的场景,我想在Laravel5中实现。我有两张桌子 用户(保存站点用户) 媒体(保存站点图像、文档、svg-s等) 我的技术限制是: 每个用户都有一个配置文件图片,并且只有一个配置文件图片 每个媒体都有作者 我将这些约束解释为逻辑列 用户表有一列 -配置文件\u图像\u id(参考媒体表id列) 媒体表有一列 -作者id(参考用户表id列) 这很好,但当我想使用artisan迁移时,就会出现问题 我的迁移按此顺序运行 迁移用户表 迁移媒体表 我的迁移将外键设置为 用户迁移 $tabl

我有一个有趣的场景,我想在Laravel5中实现。我有两张桌子

  • 用户(保存站点用户)

  • 媒体(保存站点图像、文档、svg-s等)

  • 我的技术限制是:

  • 每个用户都有一个配置文件图片,并且只有一个配置文件图片
  • 每个媒体都有作者
  • 我将这些约束解释为逻辑列 用户表有一列 -配置文件\u图像\u id(参考媒体表id列) 媒体表有一列 -作者id(参考用户表id列)

    这很好,但当我想使用artisan迁移时,就会出现问题

    我的迁移按此顺序运行

  • 迁移用户表
  • 迁移媒体表
  • 我的迁移将外键设置为

    用户迁移

    $table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');
    
    $table->foreign('author_id')->references('id')->on('users')->onDelete('restrict')->onUpdate('cascade');
    
    媒体迁移

    $table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');
    
    $table->foreign('author_id')->references('id')->on('users')->onDelete('restrict')->onUpdate('cascade');
    
    我使用的命令是

    php artisan migrate:refresh --seed
    
    问题是,在创建用户表时,媒体表还不存在。当尝试将外键关系添加到媒体表时,会产生一个SQL错误,即媒体表不存在

    我做了什么

    我在用户表迁移上创建了一个函数,在种子设定函数完成后运行该函数

        /**
         * Veyzon
         *
         * To be run after the regular run functions on all tables
         * have run
         */
        public static function delayed_up() {
            Schema::table('users', function (Blueprint $table) {
                $table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');
            });
        }
    
    这很好,但当重新混音时,媒体表将不会删除,因为用户表仍然有记录,其中有带有值的profile\u image\u id-s

    现在我想我会在媒体表“down”函数中添加几行代码,这会将所有用户表profile\u Media\u id-s设置为null,但我并不喜欢这样,因为这似乎会将我单独的迁移文件绑定在一起,当我声明这在体系结构上是正常的时,这将成为一种不好的做法


    你们会怎么做,创建双向一对一外键关系并将其集成到Laravel迁移中?

    在Laravel中创建外键的简单方法

    public function up()
    {
        Schema::create('bank_user_details', function (Blueprint $table) {
            $table->foreign('country')->references('id')->on('country')
                          ->onUpdate('cascade')->onDelete('cascade');
    
        });
    }
    

    在创建两个表之后,使用另一个迁移来创建外键。如果在设定种子时出现外键约束错误,则可以运行
    DB::语句('SET foreign_key_CHECKS=0;')