将计算列添加到 Laravel Eloquent 模型并对该列进行排序 and/or 筛选
Add a calculated column to a Laravel Eloquent model and sort and/or filter on that column
我正在尝试对 Laravel/Eloquent 中包含计算列的查询进行编码。该查询的结果集需要根据计算列进行排序 and/or 过滤。查询是;
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=1
ORDER BY name;
计算出来的列是name
,用下面的计算;
Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ") as name
我相信这个是独一无二的,因为它需要接触到后缀和姓氏 table 来计算列。到目前为止我看到的其他答案都在 table.
范围内
我有 member_names、成员、姓氏、后缀、vip_codes、membership_types 和 membership_statuses 的模型。它们都已正确连接。换句话说,我可以使用
发出一个简单的查询
MemberName::->orderBy('last_name', 'asc')->orderBy(first_name, 'asc')->where('membership_owner', 1)->paginate(10)
和下游解决额外的 table 在控制器或视图中查找没有问题。我的问题是我需要包含查询中上游名称的数据。
我的替代方法是将其转换为数据库中的视图,但我不想弄乱数据库。
感谢 Marcin Nabiałek 的建议。工作起来很有魅力。查询的最终版本,对于我们新手来说,如下;
$name = 'Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ")';
$memberNames = MemberName::selectRaw("member_names.*, {$name} as name")
->leftJoin('members', 'member_names.member_id', '=', 'members.id')
->leftJoin('surnames', 'member_names.surname_id', '=', 'surnames.id')
->leftJoin('suffixes', 'member_names.suffix_id', '=', 'suffixes.id')
->orderByRaw($name)
->paginate(10);
vip_codes、membership_types 和 membership_statuses 的 LEFT JOIN 直到视图的更下游才需要,因此此时可以将它们与 Eloquent 按预期解决它。
有关详细信息,请参阅 Laravel 手册,网址为:https://laravel.com/docs/5.8/queries
如果您已经将他们的查询写成 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)
我正在尝试对 Laravel/Eloquent 中包含计算列的查询进行编码。该查询的结果集需要根据计算列进行排序 and/or 过滤。查询是;
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=1
ORDER BY name;
计算出来的列是name
,用下面的计算;
Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ") as name
我相信这个是独一无二的,因为它需要接触到后缀和姓氏 table 来计算列。到目前为止我看到的其他答案都在 table.
范围内我有 member_names、成员、姓氏、后缀、vip_codes、membership_types 和 membership_statuses 的模型。它们都已正确连接。换句话说,我可以使用
发出一个简单的查询MemberName::->orderBy('last_name', 'asc')->orderBy(first_name, 'asc')->where('membership_owner', 1)->paginate(10)
和下游解决额外的 table 在控制器或视图中查找没有问题。我的问题是我需要包含查询中上游名称的数据。
我的替代方法是将其转换为数据库中的视图,但我不想弄乱数据库。
感谢 Marcin Nabiałek 的建议。工作起来很有魅力。查询的最终版本,对于我们新手来说,如下;
$name = 'Concat(member_names.last_name, " ", suffixes.description, ", ", surnames.description, " ", member_names.first_name, " ")';
$memberNames = MemberName::selectRaw("member_names.*, {$name} as name")
->leftJoin('members', 'member_names.member_id', '=', 'members.id')
->leftJoin('surnames', 'member_names.surname_id', '=', 'surnames.id')
->leftJoin('suffixes', 'member_names.suffix_id', '=', 'suffixes.id')
->orderByRaw($name)
->paginate(10);
vip_codes、membership_types 和 membership_statuses 的 LEFT JOIN 直到视图的更下游才需要,因此此时可以将它们与 Eloquent 按预期解决它。
有关详细信息,请参阅 Laravel 手册,网址为:https://laravel.com/docs/5.8/queries
如果您已经将他们的查询写成 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)