2017-11-04 10 views
1

私はEloquentを初めて使いました。ループで使用するときに問題があります。Eloquent first()and loops

私はとの「ジョブ」と呼ばれる私のDB内のテーブル持って想像:

  • イド - 1。値:エンジニア
  • Id - 2;値:医者
  • Id - 3;値:看護婦

また、私はJobTranslationsテーブルにそれぞれの仕事の翻訳があります。

 $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]; 

私はこのコードを実行すると、私はそれらの3つのそれのジョブと各ジョブの翻訳を持つ配列(jobTranslations)を取得するために期待してい:その後、私はこのコードの部分を持っています。 はしかし、私が代わりに3つの項目の配列を取得しますが、彼らはすべて同じだ:

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

私は、これは「firstOrFail」に起因する起こっている実現してきましたが、私は理由を理解していません。 $ job-> firstOrFail()は私には分かりません。なぜなら、それはただ一つの仕事(ループの現在の仕事)だからですが、get()を使いたくないからです。事前に

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

return translatedJobs; 

ありがとう:EFを使ってC#で

は、私はこのような何か(getまたは最初に呼び出す必要はありません)を行うと思います!あなたの設定あなたのモデルが正しい場合Foreachループを実行する必要はありません

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

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

return ['translatedJobs' => $jobTranslations]; 

+1

$ query-> toSql()を使用して、実際に実行されているクエリを確認してください。これは問題のデバッグに役立ちます。 –

+0

ありがとうございます! – Acla

答えて

1

は、私はあなたがこのイスト探しAR何assum。