簡體   English   中英

將計算列添加到 Laravel Eloquent 模型並對該列進行排序和/或過濾

[英]Add a calculated column to a Laravel Eloquent model and sort and/or filter on that column

我正在嘗試在 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)

和下游解決控制器或視圖中的額外表查找沒有問題。 我的問題是我需要包含查詢中上游名稱的數據。

我的替代方法是將其轉換為數據庫中的視圖,但我不想弄亂數據庫。

感謝 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM