Eloquent first() 和循环

Eloquent first() and loops

我是 Eloquent 的新手,在循环使用它时遇到问题。

想象一下,我的数据库中有一个名为“工作”的 table:

我还会有一个 JobTranslations table 每个工作翻译。然后,我有这段代码:

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

我意识到这是由于“firstOrFail”造成的,但我不明白为什么。 $job->firstOrFail() 对我来说没有意义,因为它只是一个作业(循环中的当前作业),但我也不想使用 get()。

在 C# 中,使用 EF,我会做这样的事情(不需要调用 get 或 first):

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

return translatedJobs;

提前致谢!

我假设你正在寻找的是这个:

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

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

return ['translatedJobs' => $jobTranslations];

如果您正确设置了模型,则无需执行 Foreach 循环。