使用Laravel Eloquent关系检索正确结果时出现问题

时间:2015-01-27 21:38:33

标签: php mysql laravel eloquent relationships

我在使用我的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数组(这将无效)。

1 个答案:

答案 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')