雄辩的“超级渴望”嵌套查询可能吗?

时间:2019-03-14 10:53:40

标签: laravel eloquent eager-loading relation nested-queries

伙伴, 我的第一篇文章,搜索并尝试不同的解决方案和方法-最终在这里结束了。

我有一个包含几个相关表的数据库。客户有一个位置,该位置具有多个设置(生命周期,例如计划,构建,运行),每个设置都有不同的电路。基本上:

customers-> locations-> settings-> circuits

现在,我需要一个带有设置和电路信息的位置列表,在这里选择电路的供应商。

我该如何雄辩地编写此查询?到目前为止,这是我尝试过的操作,但似乎忽略了“哪里供应商”子句...

$locations = Locations::with(
    ['settings' => function($query) use ($request)
        {
            $query->with(
                ['circuits' =>function($query2) use ($request)
                    {
                        $query2->where('supplier', $request->supplier);
                    }
                ]
            );                  
        }
    ])
    ->where('customer_id', $customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get(); 

我敢肯定,所有的“ hasMany”和“ belongsTo”扩展名都可用。 感谢您的阅读和回答 udowsky

更新:工作代码,基于Enver的提示:

$locations = Locations::with('settings')
    ->whereHas('settings.circuits', function($query) use ($request)
        {
            $query->where('supplier', $request->supplier);
        }
        )
    ->where('customer_id', $report->customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get();

HasManyThrough方法也可以顺利进行:

扩展位置模型:

public function circuits()
{
    return $this->hasManyThrough('App\Circuits', '\App\Settings');
}

,然后使用以下查询:

$locations = Locations::with('circuits')
    ->whereHas('circuits', function($query) use ($request)
        {
            $query->where('supplier', $request->supplier);
        }
    )
    ->where('customer_id', $report->customers_id)
    ->orderBy('country')
    ->orderBy('city')
    ->get();

谢谢大家!

1 个答案:

答案 0 :(得分:1)

您可以使用嵌套关系查询进行快速加载。

示例:

import { Effect, Actions, ofType } from '@ngrx/effects';

//....

@Injectable()
export class AppEffects {
 //  ....

  @Effect()
  myAction$ = this.actions$.pipe(
    ofType<fromActions.GetItems>(MyActionTypes.GET_ITEMS),
    switchMap(action => {
      console.log('i am in effects', action);
      return this.myService.getItems().pipe(
        map(data => new fromActions.GetItemsSuccess(data)),
        catchError(err => of(new fromActions.GetItemsSuccess(err)))
      );
    })
  );
}