Laravel 5 Eloquent双向外键迁移

时间:2017-03-17 12:53:33

标签: laravel-5 eloquent laravel-eloquent

我和有趣的场景,我想在Laravel 5中实现。我有2个表。

  1. 用户(拥有网站用户)

  2. 媒体(保存网站图片,文档,svg-s等......)

  3. 我的技术限制是:

    1. 每位用户都有个人资料图片,只有一张个人资料图片
    2. 每个媒体都有作者
    3. 这些约束我将其解释为逻辑列 Users表有一列 - profile_image_id(对媒体表id列的引用) 媒体表有一列 - author_id(对Users表id列的引用)

      这很好用,但当我想使用工匠迁移时会出现问题。

      我的迁移按此顺序运行

      1. 迁移USERS表
      2. 迁移媒体表
      3. 我的迁移将外键设置为

        USERS MIGRATION

        $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_image_id -s值,因此Media表不会删除。

        现在我想我会在Media表中添加几行代码" down"函数,将所有USERS表profile_media_id-s设置为null,但我不是很喜欢这个,因为这似乎将我的单独迁移文件绑定在一起,当我声明这在架构上正常时,那么这将变得很糟糕实践。

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

1 个答案:

答案 0 :(得分:1)

在laravel中轻松制作外键的方法

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

    });
}