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
我正在尝试在 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