我正在使用Laravel迁移在PHPMyAdmin中创建表。我想做的一件事是有一个问题表和答案表,其中一个问题可以有4个答案(多选(。我想把答案和问题与关系联系起来。
是否可以在Laravel中设置主键/外键,以便每次创建新的"问题"行时,该问题都连接两个4个答案(创建时(?这些行将手动填充,但需要进行链接。
这可能吗?如果可能,我将感谢任何解决方案。
提前谢谢。
是的,这是可能的,下面是如何在答案的文件迁移中,可以添加unsignedBigInteger(question_id)
。
在型号Question
中,您可以添加
public function answers(){return $this->hasMany(Answer::class)}
在创建答案时,您可以传入与该答案相关的请求question_id
这是你的要求还是我误解了?
是的,一种常见的方法是为Question
模型订阅created
事件。有几种方法可以做到这一点,但我通常要么在模型本身的booted()
上注册侦听器,要么在我有很多事件订阅并且希望它更结构化的情况下使用Observer。
您可以在如下模型中注册created
侦听器:
<?php
namespace AppModels;
use AppModelsAnswer;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsHasMany;
class Question extends Model
{
/**
* The "booted" method of the model.
*
* @return void
*/
protected static function booted()
{
static::created(
function ($question)
{
// This closure will be executed every time
// a new Question instance has been created
$question->Answers()->createMany(
[
['sort' => 1],
['sort' => 2],
['sort' => 3],
['sort' => 4],
]
);
}
);
}
/**
* A Question has many Answers.
*
* @return HasMany
*/
public function Answers(): HasMany
{
return $this->hasMany(Answer::class)->orderBy('sort');
}
}
在本例中,我假设您的模式中有一个sort
列,只是为了进行演示。如果您不想在新的Answer
实例上预先填充任何列,那么当然可以只传入空数组([]
(。
您可以在文档中阅读更多相关信息:https://laravel.com/docs/8.x/eloquent#events