Laravel/Eloquent 分页和 groupBy 用于 postgres 物化视图模型

Posted

技术标签:

【中文标题】Laravel/Eloquent 分页和 groupBy 用于 postgres 物化视图模型【英文标题】:Laravel/Eloquent pagination and groupBy for a postgres materialized view model 【发布时间】:2019-11-02 16:16:41 【问题描述】:

我创建了一个物化视图:accounts_index,它有几个左连接,所以我需要使用 eloquent 模型进行分组。我还需要对集合进行分页,并且无法确定事物的顺序。物化视图:

CREATE materialized VIEW accounts_index
        AS SELECT a.account_uuid,
                  a.account_no,
                  a.person_owner_uuid,
                  a.company_owner_uuid,
                  a.account_group_uuid,
                  a.account_scope_uuid,
                  a.created_at,
                  a.deleted_at,
                  s.service_uuid,
                  s.status,
                  st.service_type
        FROM   accounts a
                LEFT JOIN services s
                        ON a.account_uuid = s.account_uuid
                LEFT JOIN service_types st
                        ON s.service_type_uuid = st.service_type_uuid

雄辩的模型可以像这样抓住这张桌子:AccountIndex::all();。 我可以分页:AccountIndex::paginate(); 或做一个 groupBy:AccountIndex::all()->groupBy('account_uuid');,但不知道如何将两者结合起来。一些尝试:

AccountIndex::all()->groupBy('account_uuid')->paginate(): Method Illuminate\Database\Eloquent\Collection::paginate does not exist. AccountIndex::paginate()->groupBy('account_uuid');:不分页返回集合。 $accountsIndex = collect(\DB::table('accounts_index')->get()); $accountsIndex->groupBy('account_uuid')->paginate();:同样的Method Illuminate\Support\Collection::paginate does not exist. 异常。

我要解决的主要问题是这些联接将返回具有多个服务(所以多行)的帐户,然后我需要按account_uuid 分组。提前感谢您提供任何见解!

【问题讨论】:

【参考方案1】:

几乎

AccountIndex::groupBy('account_uuid')->paginate()

分页实际上做了一些事情

groupBy() 只是编写 SQL,就像 ->where() ->join() 等一样,都准备了一条 SQL 语句,您可以通过运行 ->toSql() 来尝试返回一个 sql 字符串。

get() all() paginate() 实际上都在做某事,例如执行 SQL。

【讨论】:

【参考方案2】:

paginate 方法与Illuminate\Database\Query\BuilderIlluminate\Database\Eloquent\Builder 类相关,在Collection 类中不存在, 在Collection类中对应的方法是forPage方法,更多信息可以从documentation获取

【讨论】:

这会丢失所有分页元数据。我想先分组,然后用完整的元数据分页。 所以你应该在数据库级别应用 groupBy 但是每个帐户只有一行 这将失去每个帐户可能拥有的多项服务。

以上是关于Laravel/Eloquent 分页和 groupBy 用于 postgres 物化视图模型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 分页控制页码与路由

Laravel Eloquent 按孩子的长度排序,然后分页

如何通过分页获取 Laravel Eloquent 中的特定列?

Laravel Eloquent,仅选择存在关系的行

复杂的 SQL / Laravel Eloquent 查询

Laravel Eloquent,添加有限行的关系变为空