我有两个表:
我要在一个对象中选择这是我的代码:
public function MainSlider(MainPresentation $MainPresentations, ChildPresentation $ChildPresentations)
{
$MainPresentations = MainPresentation::where('isEnabled', true)->get();
foreach ($MainPresentations as $MainPresentation) {
$AnArray[] = ChildPresentation::where([
['idParent', $MainPresentation['id']],
['isEnabled', true]
])->get();
}
return $AnArray;
}
但这是结果:
答案 0 :(得分:0)
您正在做的是针对每个结果执行查询,当查询开始变大时可能会无效。
您可以:
如下所示,您只需从ChildPresentation开始构建查询,并通过id设置与MainPresentation表的关系并获取集合
public function MainSlider()
{
$childPresentations = ChildPresentation::join('main_presentations','main_presentations.id','child_presentations.idParent')
->where('child_presentations.isEnabled', true)->where('main_presentations.isEnabled', true)->get();
return $childPresentations;
}
如果要所有MainPresentation及其各自的ChildPresentation,则仅启用它们。
您可以利用Laravel关系和渴望加载的优势。
首先,在MainPresentation
模型中设置关系
在 MainPresentation.php
public function childPresentation {
return $this->hasMany('App\ChildPresentation', 'idParent', 'id');
}
您的 MainSlider函数将是: (顺便说一句,不知道为什么要覆盖两个参数却没关系,为什么会收到两个参数)
public function MainSlider() {
$mainPresentations = MainPresentation::with(['childPresentations' => function ($advancedWith) {
child_presentation.isEnabled is true
$advancedWith->where('isEnabled', true);
}])
->where('isEnabled', true)->get()->toArray();
return $mainPresentations;
}
这将返回一个MainPresentations数组,其中包含一个child_presentations数组及其所有子项。
这转化为两个查询:
Select * from main_presentations where isEnabled = true;
Select * from child_presentations where isEnabled= true and id in (in the first query);
然后,Laravel在编写->toArray()
注意:如果您的 MainPresentation 模型中有一个$visible
数组,请确保在其中添加:'childPresentation'
,否则toArray不会将子项聚集到父母。
第二条注释:建议您在编写代码时遵循一些标准,通常将函数命名为camelCase
,将变量命名为camelCase
。