为了账号安全,请及时绑定邮箱和手机立即绑定

将计算列添加到 Laravel Eloquent 模型并对该列进行排序和/或过滤

将计算列添加到 Laravel Eloquent 模型并对该列进行排序和/或过滤

PHP
牧羊人nacy 2022-07-16 10:52:18
我正在尝试在 Laravel/Eloquent 中编写一个包含计算列的查询。该查询的结果集需要根据计算的列进行排序和/或过滤。查询是;  SELECT member_names.id,         member_names.member_id,         member_names.membership_owner,         Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ") as name,         vip_codes.description,         membership_types.description,         membership_statuses.description    FROM member_names         LEFT JOIN members ON member_names.member_id = members.id         LEFT JOIN surnames ON member_names.surname_id = surnames.id         LEFT JOIN suffixes ON member_names.suffix_id = suffixes.id         LEFT JOIN vip_codes ON member_names.vip_code_id = vip_codes.id         LEFT JOIN membership_types ON members.membership_type_id = membership_types.id         LEFT JOIN membership_statuses ON members.membership_status_id = membership_statuses.id   WHERE member_names.membership_owner=1ORDER BY name;计算的列是name并且是用以下计算的;Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ") as name我相信这个是独一无二的,因为它需要访问后缀和姓氏表来计算列。到目前为止,我看到的其他答案都保留在表格中。我有member_names、members、surnames、suffixes、vip_codes、membership_types和membership_statuses的模型。它们都已正确连接。换句话说,我可以发出一个简单的查询MemberName::->orderBy('last_name', 'asc')->orderBy(first_name, 'asc')->where('membership_owner', 1)->paginate(10)并且下游可以毫无问题地解决控制器或视图中的其他表查找。我的问题是我需要包含查询中上游名称的数据。我的替代方法是将其转换为数据库中的视图,但我不想弄乱数据库。感谢 Marcin Nabiałek 的建议。像魅力一样工作。对于我们新手来说,查询的最终版本如下;$name = 'Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ")';vip_codes、membership_types 和 members_statuses 的 LEFT JOIN 直到视图中的更下游才需要,因此此时可以将它们排除在外,而 Eloquent 会按预期解决它。有关更多信息,请参阅 Laravel 手册:https ://laravel.com/docs/5.8/queries
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

如果您已经将他们的查询写成 Eloquent 并且您需要添加这一列,您可以执行以下操作:


$name = 'Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ")';


MemberName::selectRaw("member_names.*, {$name} as name") 

   // here you put joins and other code you need

->orderByRaw($name)

->paginate(10)


查看完整回答
反对 回复 2022-07-16
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信