2017-11-04 2 views
1

Ich bin neu in Eloquent und ich habe Probleme, wenn Sie es mit Schleifen verwenden.Eloquent zuerst() und Schleifen

Stellen Sie sich vor mir einen Tisch in meinem db namens ‚Jobs‘ mit:

  • Id - 1; Wert: Ingenieur
  • Id - 2; Wert: Arzt
  • Id - 3; Wert: Krankenschwester

Ich hätte auch eine JobTranslations-Tabelle mit jeder Job-Übersetzungen. Dann habe ich dieses Stück Code:

 $jobTranslations = []; 

     $lang = $request->input('lang') ?? 'pt'; 
     foreach(Job::all() as $job) { 
      $job = $job->with(['jobtranslations' => function($query) use ($lang) { 
       $query->where('languageCode', $lang); 
      }])->firstOrFail(); 
      $jobTranslations[] = $job; 
}   
     return ['translatedJobs' => $jobTranslations]; 

Wenn ich diesen Code ausführen, erwarte ich ein Array (jobTranslations) mit den drei Jobs, es zu erhalten und jede Übersetzung Job. Allerdings bekomme ich stattdessen ein Array mit drei Elementen, aber sie sind alle gleich:

array([‘id’ => 1, ‘value’ => ‘engineer’, ‘jobtranslations’ => [another array]], 
     [‘id’ => 1, ‘value’ => ‘engineer’, ‘jobtranslations’ => [another array]], 
     [‘id’ => 1, ‘value’ => ‘engineer’, ‘jobtranslations’ => [another array]] 
); 

Ich habe erkannt, dies wegen ‚firstOrFail‘ passiert, aber ich verstehe nicht, warum. $ job-> firstOrFail() macht für mich keinen Sinn, weil es nur ein Job ist (der aktuelle in der Schleife), aber ich möchte auch nicht get() verwenden.

In C#, mit EF, würde ich so etwas wie diese (keine Notwendigkeit bekommen oder zuerst zu nennen) tun:

foreach(var job in jobs) { 
translatedJobs.Add(job.Include(j => j.jobtranslations.FirstOrDefault(jt => jt.languageCode == lang))); 
} 

return translatedJobs; 

Vielen Dank im Voraus!

+1

Verwenden Sie $ query-> toSql() und sehen Sie, was die Abfrage ist, die tatsächlich ausgeführt wird, und dies wird Ihnen helfen, das Problem zu beheben –

+0

Vielen Dank für den Tipp! – Acla

Antwort

1

ich ASSUM was Sie Ar ist diese Suche:

$lang = $request->input('lang', 'pt'); 

$jobTranslations = Job::with([ 
    'jobtranslations' => function ($query) use($lang) 
    { 
     $query->where('languageCode', $lang); 
    } 
])->get()->toArray(); 

return ['translatedJobs' => $jobTranslations]; 

Es besteht keine Notwendigkeit einer foreach-Schleife, wenn Sie Setup Ihr ​​Modell richtig zu tun.