首页 > 解决方案 > Laravel 有两个来自同一张表的外键

问题描述

嗨,我对数据库设计不是很好,所以我想知道是否可以从同一个表中创建一个具有两个外键的表。

这是我试图展示这种关系的努力 在此处输入图像描述

我是否可以使用我尝试过的 laravel 迁移来做到这一点,但它不起作用

Schema::create('events', function (Blueprint $table) {
        $table->increments('event_id');
        $table->integer('book_id')->unsigned();
        $table->integer('buyers_id')->unsigned();
        $table->integer('seller_id')->unsigned();
        $table->integer('status')->default(1);
        $table->timestamps();

        $table->foreign('book_id')->references('id')
        ->on('books')
        ->onDelete('cascade')
        ->onUpdate('cascade');
        $table->foreign('buyers_id')->references('id')
        ->on('users')
        ->onDelete('cascade')
        ->onUpdate('cascade');
        $table->foreign('seller_id')->references('id')
        ->on('users')
        ->onDelete('cascade')
        ->onUpdate('cascade');
    });

所以事件表将有 3 个 FK

这是用户表的架构

标签: laraveldatabase-designdatabase-migration

解决方案


如果在您的应用程序中,您的用户既可以充当卖方又可以充当买方,那么role_id您的任务评论中提出的解决方案将不适合您。

按照您已经在研究的解决方案,您的迁移似乎没有任何问题,当您运行时是否php artisan migrate显示任何错误?如果您发布它,我可以更新我的回复的这一部分。

在 Event 模型中,您必须像这样描述关系:

public function buyer()
{
    return $this->belongsTo(User::class, 'buyers_id');
}

public function seller()
{
    return $this->belongsTo(User::class, 'seller_id');
}

因此,当您使用 Event 模型时,您可以这样做

$event = new Event;
$event->buyers_id = 1; // supposing there's a user with id 1
$event->seller_id = 2; // supposing there's a user with id 2
$event->save();

$event->buyer;
# => <User::class id=1>
$event->seller;
# => <User::class id=2>

[更新] 添加一点提示

与您的问题无关,但我建议您将buyers_id列重命名为buyer_id. 在 Laravel 中将外键名称保持为单数是一种常见的做法。


[更新] 文档链接

有关关系方法的完整文档。

https://laravel.com/docs/5.7/eloquent-relationships#one-to-many-inverse


推荐阅读