Eloquent first() 和循环
Eloquent first() and loops
我是 Eloquent 的新手,在循环使用它时遇到问题。
想象一下,我的数据库中有一个名为“工作”的 table:
- Id – 1;价值:工程师
- Id – 2 ;价值:医生
- Id – 3 ;价值:护士
我还会有一个 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 循环。
我是 Eloquent 的新手,在循环使用它时遇到问题。
想象一下,我的数据库中有一个名为“工作”的 table:
- Id – 1;价值:工程师
- Id – 2 ;价值:医生
- Id – 3 ;价值:护士
我还会有一个 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 循环。