嗨,我对数据库设计不是很好,所以我想知道是否可以用来自同一表的两个外键创建一个表。
我是否可以使用我尝试过的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
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unsigned();
$table->integer('user_type');
$table->integer('password');
$table->timestamps();
});
这是用户表的架构
如果您的用户在您的应用程序中既可以充当卖方又可以充当买方,那么您的任务注释中提出的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 = 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>
[[UPDATE]稍加提示
与您的问题无关,但我建议您将buyers_id
列重命名为buyer_id
。在Laravel中将外键名称保留为单数是一种常见的做法。
[[UPDATE]链接到文档
有关该关系的方法的完整文档。
– https://laravel.com/docs/5.7/eloquent-relationships#one-to-many-inverse