Laravel从Eloquent在一个对象中的侧查询中获得查询结果



我有两个表:

  1. main_presentations所以这里我有">id"one_answers">isEnabled
  2. 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;
}

但结果是:

在此处输入图像描述

您所做的是根据结果执行查询,当查询开始变大时,这可能是无效的。

您可以:

  1. 使用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

最新更新