Queries between tables with Eloquent - Laravel 5

7

Well, I have the following problem when using Laravel 5 in the table relationship:

I have these 4 tables (hypothetical names to illustrate the problem):

UsingtheLaravel5templatesI'velistedthemtogether:

CompanyTemplate

publicfunctionpessoa(){return$this->hasMany('App\Pessoas')}

PeopleTemplate

publicfunctiontrabalho(){return$this->hasMany('App\Trabalho')}publicfunctionempresa(){return$this->belongsTo('App\Empresa')}

WorkTemplate

publicfunctioncusto(){return$this->hasMany('App\Custo')}publicfunctionpessoa(){return$this->belongsTo('App\Pessoa')}

CostModel

publicfunctiontrabalho(){return$this->belongsTo('App\Trabalho')}

Myquestionishowtogetthesumofthecostofallthepeopleofacertaincompanyandofallthejobs...Forexample,toknowthetotalcostofajobIdosomethinglikethis:

$trabalho=newTrabalho->find($id)$custoDoTrabalho=$trabalho->custo->sum('montante')

However,ifyoudothefollowing:

$pessoas=newEmpresa->find($id)->pessoa$custoDosTrabalhosTodasAsPessoas=$pessoas->trabalho->custo->sum('montante')

Doesnotwork!

ToachievethedesiredresultIhavetowritemanylines(andI'mlazyandtheprojectisbigandwithmanycaseslikethese!)

$custo=0;$pessoas=newPessoa->find($id);$trabalhos=$pessoas->trabalho;foreach($trabalhosas$trabalho)$custo+=$trabalho->custo->sum('montante')

Isthereanywaytouse"Eloquent" relationships for this purpose, or do I really have to type everything?

(sorry for the large text ... thank you in advance!)

    
asked by anonymous 21.03.2015 / 22:04

2 answers

3
$pessoas = new Empresa->find($id)->pessoa
$custoDosTrabalhosTodasAsPessoas = $pessoas->trabalho->custo->sum('montante')
     

This does not work because $pessoas is a list. The right would be    $pessoas[0]->trabalho->... . But that would not solve your problem in the   general.

To solve your problem of adding up the cost of all the people of a certain company and of all the work,

select sum(custos.montante) from empresas
join pessoas on (pessoas.empresa_id = empresas.id)
join trabalho on (trabalho.pessoa_id = pessoas.id)
join custos on (custos.trabalho_id = trabalho.id)
where empresas.id = ?

This sql you can run it raw:

DB::statement('teu sql...');

But using eloquent you can do this:

Empresa::
     join('pessoas', function($query){
         $query->on('pessoas.empresa_id','=','empresas.id') 
      })
      ->join('trabalho', function($query){
         $query->on('trabalho.pessoa_id','=','pessoas.id') 
      })
      ->join('custos',function($query){
         $query->on('custos.trabalho_id','=','trabalho.id') 
      })
     ->where('empresas.id','=',1)
     ->sum('custos.montante')

Another way:

DB::table('empresas')
         ->join('pessoas', 'pessoas.empresa_id', '=', 'empresas.id')
         ->join('trabalho', 'trabalho.pessoa_id', '=', 'pessoas.id')
         ->join('custos', 'custos.trabalho_id', '=', 'trabalho.id')
         ->where('empresas.id','=',1)
         ->sum('custos.montante');
    
21.08.2015 / 05:52
1

You do not need to check for each person .. to add up the entire amount of all jobs:

$total = App\Custo::sum('montante');

To add up the amount per job:

$trabalhoTotal = App\Trabalho::find(1)->custo->sum('montante');

Or:

$trabalhoTotal = App\Custo::where('trabalho_id',1)->sum('montante');
    
21.03.2015 / 23:16