lightalex
lightalex

Reputation: 879

Querying multiple table to get specific data with Eloquent ORM

I am quite new to Laravel 4 and its great Eloquent ORM. I have four tables such as :

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

I have the sector id, and I want to get all Mailings associated. But I also need to reach the MailingLanguages table containing the content translations for a specific Mailing.

So for now I can get all Mailings for a specific sector doing :

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

But doing Sector::find($iFormSectorCode)->mailings()->mailingsLanguages()->get()->toArray(); don't work even if the relation between Mailing and MailingLanguages is defined :

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

So I don't know how to get all translations for a specific Mailing, for a specific Sector.

Upvotes: 0

Views: 1031

Answers (1)

ollieread
ollieread

Reputation: 6301

Providing that you've setup relationships between all of the tables, you can request that they be grabbed with the initial request.

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

This will create a nice join that will include related records for Mailing, then their related records for MailingLanguage, as well as the requested Sector.

The above example does assume that Sector has a relationship called mailings and that Mailing has a relationship called languages.

You could also load them in after the fact.

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

I would recommend making use of the findOrFail method that laravel provides.

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

This saves having to check whether $sector returned anything, as an exception will be thrown.

Hope that helps.

Upvotes: 1

Related Questions