Laravel雄辩5.3 Eager / Lazy加载相关模型有多个限制

时间:2017-02-10 07:15:28

标签: php laravel laravel-5 eloquent laravel-5.3

我在Lazy / Eager Loading中充分利用Laravel的雄辩,并遇到了一个有趣的问题。

说明

  • 帐户有多个组,每个组都有一个优先级编号
  • 所有群组都包含其中的项目

问题:

  • 我需要手动设置每组退回商品数量的限制

  • 此处的区别在于限制数会根据每个组的优先级更改

因此,例如,雄辩"选择"声明将获得所有三个组,但将组1中返回的项目数限制为仅3个项目,组2仅限8个项目,组3到17个项目。

我尝试过做的事情:

  • 控制器中的代码以获取记录

    return Account::with([
    'group_list.item'
    ])->where('group_id', $my->group_id)
    ->orderBy('group_priority_num', 'ASC')
    ->take(3) <----Gets three groups
    ->get(['group_priority_num','group_title','group_id']);
    
  • 群组模型

     public function group_list() {
    
     // Example
     $this->number = [4 , 7, 15];
    
    
     return $this->group()->limit($this->number)->groupBy('user_group_id_fk');
     }
    

这只返回1条记录或根本没有,所以我现在很困惑如何正确处理这个问题。有人可以给我一些指导吗?

非常感谢任何帮助,谢谢你提前。 干杯!

1 个答案:

答案 0 :(得分:2)

通过使用WHERE foreign_key_column IN (list of primary model IDs)的第二个查询实现预先加载。有了这样的查询,就不可能在每个模型的基础上设置限制,除非有一些其他条件可以进一步过滤结果。

您有3个选项:

  • 让Eloquent急切加载所有内容,并根据您的需要在PHP中过滤结果。
  • 通过仅获取主要模型,然后对每个模型与其各自限制的关系进行单独查询,执行急切加载自我。
  • 在您的groups表中添加一个标记列,用于标记应为每个组返回的行。