我和有趣的场景,我想在Laravel 5中实现。我有2个表。
用户(拥有网站用户)
媒体(保存网站图片,文档,svg-s等......)
我的技术限制是:
这些约束我将其解释为逻辑列 Users表有一列 - profile_image_id(对媒体表id列的引用) 媒体表有一列 - author_id(对Users表id列的引用)
这很好用,但当我想使用工匠迁移时会出现问题。
我的迁移按此顺序运行
我的迁移将外键设置为
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迁移中?
答案 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');
});
}