我已经和有趣的场景,我想在Laravel 5中实现。我有2个表格。Laravel 5雄辩的双向外键迁移
用户(存放在站点的用户)
媒体(盛放网站图片,文档,SVG-S,等...)
我的技术限制是:
- 每位用户都有一张个人资料图片,只有一张个人资料图片
- 个每个媒体有一个作者
这些约束上我解释上 用户表有一栏 作为逻辑列 - profile_image_id(参照媒体表中的id列) 媒体表中有一栏 - AUTHOR_ID(参考Users表id列)
这可以很好地工作,但当我想使用手工迁移时会变得有问题。
我的迁移顺序
- 迁移用户表
- 迁移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迁移中?
使用其他迁移创建两个表后创建外键。如果在播种时出现外键约束错误,您可以运行'DB :: statement('SET FOREIGN_KEY_CHECKS = 0;');'。 – TheFallen