Laravel 5 Eloquent Realtionship有一个通过

时间:2016-03-25 16:08:50

标签: laravel eloquent

我有以下数据库结构

products            quesionnaires           questionnaire_results
--------            --------------          ----------------------
id                  id                      id
questionnaire_id                            questionnaire_id
                                            product_id

调查问卷可用于多种产品,并在调查表结果表中存储每种产品的结果。

产品只能有一份调查问卷,只有一份问卷调查结果。

我需要一种从产品模型中获取问卷调查结果的方法。

2 个答案:

答案 0 :(得分:4)

如果您没有QuestionnaireResult模型,那么就没有直接的Eloquent关系,因为所有默认关系都依赖于Eloquent模型的存在。但是,通过将ProductQuestionnaire之间的关系视为Many to Many,并将questionnaire_results视为您的数据透视表(甚至认为您真的是这样),有一种相当干净的方法可以实现此目的知道产品只属于一份调查问卷。)

产品型号:

public function questionnaire() {
    return $this->belongsToMany('App\Questionnaire', 'questionnaire_results');
}

问卷调查模型:

public function products() {
    return $this->belongsToMany('App\Product', 'questionnaire_results');
}

由于此关系将返回一个集合,您需要使用[0]访问第一个数组或使用first()方法。

$product->questionnaire()->first();

但是,如果您拥有QuestionnaireResult模型,那么您将拥有非常简单的One to One关系,而无需通过其他模型。您有一些属于产品的问卷调查结果,而产品只能有一组问卷调查结果(根据您的帖子信息)。

产品型号:

public function questionnaireResult() {
    return $this->hasOne('App\QuestionnaireResult');
}

问卷调查结果模型:

public function product() {
    return $this->belongsTo('App\Product');
}

答案 1 :(得分:1)

// Product Model
public function quesionnaire() {
    return $this->hasOne("App\Quesionnaire");
}

// Quesionnaire Model
public function questionnaire_result() {
    return $this->hasOne("App\Questionnaire_result");
}

$product->quesionnaire->questionnaire_result