Laravel 多对多 2 级向下枢轴 table

Laravel many to many 2 level down pivot table

我正在尝试在 Laravel 中构建一个调查模块,用户可以在其中创建调查、为调查中的问题分配问题和选项。

为了满足上述要求,我创建了以下模型 & tables

Model: Question
Table: questions

| id | question                       |
| -------- | -------------------------|
| 1        | How is the performance?  |
| 2        | How did you know about us|

Model: Option
Table: options

| id  | option    |
| --- | --------- |
| 1   | Good      |
| 2   | Bad       |
| 3   | Google    |
| 2   | SMS       |

现在问题和调查之间的关系将存储在 pivot table

Model: SurveyQuestion
Table: survey_questions

| id | survey_id| question_id |
| ---| -------- |-------------|
| 1  | 1        |1            |
| 1  | 1        |2            |

到目前为止,我知道如何使用 attach/sync.

将数据存储到数据透视表 table 中

现在的问题是,根据要求,每个调查问题可能有多个选项,因此我创建了另一个枢轴 table survey_question_option,其中我使用 survey_questions 主键作为外键。

Model: SurveyQuestionOption
Table: survey_question_options

| id | survey_question_id| option_id |
| -- | ----------------- |-----------|
| 1  | 1                 |1          |
| 1  | 1                 |2          |

现在我的问题是,使用主键 table 作为外键进入另一个 table 是否正确?

如果是,那么我如何使用 laravel 关系将数据存储到 survey_question_options table 中?

如果不是,那么更好的解决方案是什么?

在这种情况下,您可以创建一个自定义中间 Table 模型(自定义枢轴)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\Pivot;

class SurveyQuestion extends Pivot
{
    public function options()
    {
        //You need to create a pivot pivot table survey_question_option
        //with (survey_question_id, option_id)
        return $this->belongsToMany(Option::class, 'survey_question_option');
    }
}

您的模型需要使用 using() 方法识别这个新的 Pivot 模型。这是调查模型

的示例
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Survey extends Model
{
    /**
     * The users that belong to the role.
     */
    public function questions()
    {
        return $this
            ->belongsToMany(Question::class)
            ->using(SurveyQuestion::class);
    }
}

您将能够像这样通过 eloquent 访问它们

$survey->questions->pivot->options

有关详细信息,您可以在此处查看文档: https://laravel.com/docs/8.x/eloquent-relationships#defining-custom-intermediate-table-models