Laravel在一个对象中通过Eloquent从侧面查询中的查询获取结果

时间:2018-07-25 17:49:21

标签: laravel eloquent

我有两个表:

  1. main_presentations 所以在这里我有“ id ”和“ isEnabled ”;
  2. child_presentations 在这里,我有“ id ”,“ isEnabled ”和“ 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;

}

但这是结果:

enter image description here

1 个答案:

答案 0 :(得分:0)

您正在做的是针对每个结果执行查询,当查询开始变大时可能会无效。

您可以:

  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,则仅启用它们。

您可以利用Laravel关系和渴望加载的优势。

  

https://laravel.com/docs/5.6/eloquent-relationships

首先,在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