与Laravel Eloquent ORM的数据库关系

时间:2014-11-28 14:27:24

标签: laravel eloquent

我是Laravel的新手而且我被困住了。这就是我正在努力的目标:

$questions = Question::find($id)->quiz(); // this code retrieves data from
                                          // the table using the primary key
                                          // in the table. The is a parameter
                                          // that is passed via get.

这就是我现在所拥有的:

$questions = Question::where('quiz_id', '=', $id)->quiz();

这是我得到的错误:

Call to undefined method Illuminate\Database\Query\Builder::quiz() 

我想做什么:

我想运行一个查询来使用表中的外键而不是主键从我的数据库表中获取数据,我也希望能够使用与此相关的关系,如我上面尝试的那样。< / p>

修改:添加了问题模型

<?php

class Question extends Eloquent{

    protected $table = 'quiz_questions';

    public function quiz()
    {
        return $this->belongsTo('Quiz');
    }

}

2 个答案:

答案 0 :(得分:1)

Question::find($id)->quiz()调用quiz()函数将返回一个查询构建器实例,允许您查询问题的父级,在此之前它不会返回任何数据,直到您调用->get()或另一种实际执行查询的方法。

如果您想要返回属于某个测验的所有问题,那么您可以这样做。

$questions = Question::where('quiz_id', $id)->get();

对于Eloquent\Collection等于quiz_id的所有问题,这将返回$id个结果。

如果你已经设置了测验和问题之间的关系,那么你也可以使用Laravel关系来做到这一点。

$quiz = Quiz::findOrFail($id);

foreach($quiz->questions as $question)
{
    // Do stuff with $question
}

Laravel将自动从属于您已从数据库获得的测验的数据库中提取问题,这称为急切加载http://laravel.com/docs/4.2/eloquent#eager-loading

答案 1 :(得分:1)

Wader是正确的,只是调用where()不会执行您的查询。您可以调用get()并获得可迭代结果,或者如果只需要一个结果,则使用first()

$quiz = Question::where('quiz_id', '=', $id)->first()->quiz();