将相同的外键添加到4行Laravel中



我正在使用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

最新更新