【问题标题】:Laravel have Two foreign Key from the same tableLaravel 有两个来自同一张表的外键
【发布时间】:2019-05-01 11:33:16
【问题描述】:

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

这是我试图展示这种关系的努力

我是否可以使用我尝试过的 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

  • 书籍中的一个 FK
  • 来自用户的两个 FK

     Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
    
        $table->string('name')->unsigned();
    
        $table->integer('user_type');
    
        $table->integer('password');
    
        $table->timestamps();
    
    
    });
    

这是用户表的架构

【问题讨论】:

  • 为什么不创建单列buyer_seller_id 并赋予它们buyerseller 的角色?
  • 在用户表中?
  • events 表中的外键和users 表中的role
  • 在用户中可以这样(名称、user_type、“role_id”和密码)
  • 是的,并根据要求在事件表中添加他们的 ID

标签: laravel database-design database-migration


【解决方案1】:

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

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

在事件模型中,你必须这样描述关系:

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 中将外键名称保持为单数是一种常见的做法。


[UPDATE] 文档链接

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

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

【讨论】:

  • 谢谢,如果可以的话。从用户模型访问事件 $this->hasMany('App\Event', 'buyers_id');和 $this->hasMany('App\Event', 'seller_id');
  • 访问名称等卖家和买家属性时出现问题
猜你喜欢
  • 2017-03-03
  • 2019-11-20
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多