我在使用我的Eloquent关系检索某组结果时遇到了麻烦。
型号:
申请表(表格:申请表)[ id ,标题,有效]
问题(表格:问题)[ id , application_id ,question_text,helper_text, question_type ]
QuestionType(table:question_type)[ id ,类型]
粗体=主键,斜体=外键
关系:
一个Application
有很多Questions
许多Questions
可以属于一个Application
。
一个Question
有一个QuestionType
(由question_type FK引用)
一个QuestionType
可以属于许多Questions
(通过引用它的id作为question_type)
QuestionType
是一个静态表,永远不会添加或删除值,但类型属性可以更改。
我希望能够做到这样的事情:
$application = Application:find($application_id);
$questions = $application->questions()->get();
并将question_type
替换为从QuestionType
模型中提取的相应类型。
我查看了Laravel和Eloquent文档,在IRC上询问过,并查看了其他StackOverflow文章,但找不到有帮助的答案。我认为让我失望的是我的question_type
表中的非常规外键Question
。我得到了一次KIND OF工作,异常question_type
被替换为QuestionType
数组(这将无效)。
答案 0 :(得分:2)
我想首先将此关系添加到Question
:
public function type(){
return $this->belongsTo('QuestionType', 'question_type');
}
然后就像平常一样使用它:
$question = Question::find(1);
$question->type;
对于应用程序的所有问题(急切加载)
$application = Application:find($application_id);
$questions = $application->questions()->with('type')->get();
要仅获取该类型的实际名称(名为type
的列),您可以添加attribute accessor。然而,由此命名变得更加困难。如果您真的不想将您的外键名称更改为question_type_id
,我建议您:
public function typeRelation(){
return $this->belongsTo('QuestionType', 'question_type');
}
public function getTypeAttribute(){
if(is_null($this->typeRelation)) return null;
return $this->typeRelation->type;
}
属性访问器允许您使用$question->type
并直接获取相关模型的属性。在急切加载时不要忘记调整关系名称:with('typeRelation')