使用Eloquent ORM查询多个表以获取特定数据

时间:2014-05-16 06:25:30

标签: laravel eloquent

我对Laravel 4及其出色的Eloquent ORM都很陌生。我有四个表,如:

Sector          (iSectorCode);
MailingSector   (iSectorCode, iMailingCode);
Mailing         (iMailingCode);
MailingLanguages(iMailingCode, sTranslation);

我有扇区ID,我希望将所有邮件关联起来。但我还需要访问包含特定邮件的内容翻译的MailingLanguages表。

所以现在我可以获得特定部门的所有邮件:

Sector::find($iSectorCode)->mailings()->get()->toArray();

但即使定义了Mailing和MailingLanguages之间的关系,Sector::find($iFormSectorCode)->mailings()->mailingsLanguages()->get()->toArray();也不起作用:

public function mailingsLanguages(){
    return $this->hasMany('MailingLanguage','iMailingCode');
}

所以我不知道如何为特定的部门获取特定邮件的所有翻译。

1 个答案:

答案 0 :(得分:1)

假设您已在所有表之间设置关系,您可以请求使用初始请求抓取它们。

$sector = Sector::with('mailings', 'mailings.languages')->find($iSectorCode);

这将创建一个很好的联接,其中包含Mailing的相关记录,然后是MailingLanguage的相关记录,以及请求的Sector

上面的示例假设Sector有一个名为mailings的关系,而Mailing有一个名为languages的关系。

您也可以在事后加载它们。

$sector = Sector::find($iSectorCode);
$sector->load(['mailings', 'mailings.languages']);

我建议使用laravel提供的findOrFail方法。

try {
    $sector = Sector::with(['mailings', 'mailings.langauges'])
        ->findOrFail($iSectorCode);
} catch(ModelNotFoundException $e) {
    // do something here
}

这样可以省去$sector是否返回任何内容,因为会抛出异常。

希望有所帮助。