在大bd

时间:2018-05-22 06:22:23

标签: laravel

我知道这个问题可能有点荒谬但我已经坚持了两天而且我来这里寻找替代我目前已经开发的东西。

我把你放在上下文中,我们有三个表:

  • 用户
  • 的Sedes
  • UsersSedes(pivot)[user_id,sedes_id]

目前,我需要在列表(Datatable)中显示所有在其sedes中包含活动用户(管理员)中配置的席位的用户。

实施例: 管理员,登录和活动部门是A和B(还有C和D) 列表: 用户1使用sede A. 用户2使用sede B. 用户3使用sede B. 用户4使用sede B

我不知道我是否解释......

问题是我的表有大约2000条记录,因为我已编程管理数据需要很多,因为它会进行2000次查询。

EDIT 实际上我使用foreach来创建一个包含数据的数组,例如:

$ pacientes = Usuario :: with(['sedes']) - > where('role_id',3) - > get();

    $sedesHabilitadas = auth()->user()->sedes->pluck('id')->toArray();

    $habilitados = array();


     foreach($pacientes as $paciente)
    {
      if( in_array($paciente->sedes->pluck('id')->first(), $sedesHabilitadas))
        {
            array_push($habilitados, $paciente);
        }      

    }    

1 个答案:

答案 0 :(得分:0)

您希望sedes位于role_id = 3user_id = active user的哪个位置?如果是这种情况,那么您只需使用主查询添加where约束:

$habilitados = Usuario::where('role_id', 3)
    ->where('user_id', auth()->user()->id)
    ->with(['sedes'])->get();

这应该为用户提供'sedes'。否则,如果你的意思是它应该返回Users ::他们的'sedes'与管理员有相同的'sedes',那么你可以考虑这个:

$sedesHabilitadas = auth()->user()->sedes->pluck('id')->toArray();
$pacientes = Usuario::with(['sedes' => function($query) use (sedesHabilitadas){
        $query->whereIn('id', $sedesHabilitadas);
    ])->where('role_id', 3)->get();

但这看起来像一个重复的方法,因为被查询的id已经被检索为$sedesHabilitadas

如果情况并非如此,请告诉我,我可能不得不删除此答案。