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

标签 php laravel eloquent laravel-6

我正在尝试在 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=1
ORDER 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)

下游可以毫无问题地解决 Controller 或 View 中的其他表查找问题。我的问题是我需要包含查询中上游名称的数据。

我的替代方案是将其转换为数据库中的 View ,但我不想弄乱数据库。

感谢 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 直到 View 中的更下游才需要,因此此时可以将它们排除在外,而 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)

关于php - 将计算列添加到 Laravel Eloquent 模型并对该列进行排序和/或过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59582814/

相关文章:

php - IE 不显示所有图像

php - 编译错误 : Cannot declare class because the name is already in use

php - Mandrill 不会替换 html 模板中的合并标签内容

php - MYSQL如何做日期间的SELECT?

laravel - 如何在路由中使用参数运行 artisan 命令?

php - Laravel 测试 - 迁移/刷新错误的环境

php - 在加载时向 Laravel/Eloquent 模型添加自定义属性?

php - Laravel 和数据表 : Ajax data not refreshing table with new ajax parameters from html select

php - 具有多个值的 Eloquent 范围

laravel - 按 Eloquent 访问器字段在 Yajrabox 数据表中排序