我有两个表:
- main_presentations所以这里我有">id"one_answers">isEnabled
- child_表示这里我有">id"、">isEnabled"one_answers">idParent
我想在中选择一个对象这是我的代码:
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;
}
但结果是:
在此处输入图像描述
您所做的是根据结果执行查询,当查询开始变大时,这可能是无效的。
您可以:
- 使用querybuilder
如下所示,您只需从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,则仅启用这些。
你可以利用拉拉威尔的关系和急切的负载。
https://laravel.com/docs/5.6/eloquent-relationships
首先,在MainPresentation
型号中设置关系
在MainPresentation.php中
public function childPresentation {
return $this->hasMany('AppChildPresentation', '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
。