Php 雄辩的first()和循环

Php 雄辩的first()和循环,php,laravel-eloquent,Php,Laravel Eloquent,我是个口才好的新手,在使用循环时遇到了麻烦 假设我在数据库中有一个名为“Jobs”的表,其中包含: Id–1;价值:工程师 Id–2;价值:医生 Id–3;价值观:护士 我还有一个工作翻译表,上面有每个工作翻译。然后,我有一段代码: $jobTranslations = []; $lang = $request->input('lang') ?? 'pt'; foreach(Job::all() as $job) {

我是个口才好的新手,在使用循环时遇到了麻烦

假设我在数据库中有一个名为“Jobs”的表,其中包含:

  • Id–1;价值:工程师
  • Id–2;价值:医生
  • Id–3;价值观:护士
我还有一个工作翻译表,上面有每个工作翻译。然后,我有一段代码:

     $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];
当我运行这段代码时,我希望得到一个数组(jobTranslations),其中包含这3个作业以及每个作业的翻译。 但是,我得到了一个包含三项的数组,但它们都是相同的:

array([‘id’ => 1, ‘value’ => ‘engineer’, ‘jobtranslations’ => [another array]],
      [‘id’ => 1, ‘value’ => ‘engineer’, ‘jobtranslations’ => [another array]], 
      [‘id’ => 1, ‘value’ => ‘engineer’, ‘jobtranslations’ => [another array]]
); 
我意识到这是因为“第一次或失败”,但我不明白为什么$job->firstOrFail()对我来说没有意义,因为它只是一个作业(循环中的当前作业),但我也不想使用get()

在C#中,使用EF,我会执行类似的操作(无需调用get或first):


提前谢谢

我想你要找的是:

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

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

return ['translatedJobs' => $jobTranslations];
如果模型设置正确,则无需执行Foreach循环。

使用$query->toSql()查看实际运行的查询是什么,这将帮助您调试问题
$lang = $request->input('lang', 'pt');

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

return ['translatedJobs' => $jobTranslations];