2017-03-17 62 views
0

我已经和有趣的场景,我想在Laravel 5中实现。我有2个表格。Laravel 5雄辩的双向外键迁移

  1. 用户(存放在站点的用户)

  2. 媒体(盛放网站图片,文档,SVG-S,等...)

我的技术限制是:

  1. 每位用户都有一张个人资料图片,只有一张个人资料图片
  2. 个每个媒体有一个作者

这些约束上我解释上 用户表有一栏 作为逻辑列 - profile_image_id(参照媒体表中的id列) 媒体表中有一栏 - AUTHOR_ID(参考Users表id列)

这可以很好地工作,但当我想使用手工迁移时会变得有问题。

我的迁移顺序

  1. 迁移用户表
  2. 迁移MEDIA表运行

我的移民有设定外键

USERS迁移

$table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade'); 

MEDIA迁移

$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。

现在我想我会添加几行代码到媒体表“下”功能,这将设置所有USERS表profile_media_id-s为空,但我不太喜欢这个,因为这似乎配合我将单独的迁移文件放在一起,当我将其声明为架构正常的时候,那么这将成为一种不好的做法。

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

+0

使用其他迁移创建两个表后创建外键。如果在播种时出现外键约束错误,您可以运行'DB :: statement('SET FOREIGN_KEY_CHECKS = 0;');'。 – TheFallen

回答

1

简单的方式让foriegn键laravel

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

    }); 
}