Laravel Contact模型如何实现按条件关联排序的sortByName作用域
Contact模型sortByName查询作用域实现方案
直接在Contact模型中添加如下作用域方法即可:
<?php namespace App\Models; use Illuminate\Support\Facades\DB; // 顶部引入DB门面 class Contact extends Model { // 原有关联代码保留即可 public function individualDetails() { return $this->hasOne(ContactIndividualDetails::class); } public function organizationalDetails() { return $this->hasOne(ContactOrganizationalDetails::class); } // 新增排序作用域 public function scopeSortByName($query, string $direction = 'asc') { return $query ->select('contacts.*') // 避免关联表同名字段覆盖主表数据 ->leftJoin('contact_organizational_details', 'contacts.id', '=', 'contact_organizational_details.contact_id') ->leftJoin('contact_individual_details', 'contacts.id', '=', 'contact_individual_details.contact_id') ->orderBy( DB::raw(" CASE contacts.type WHEN 'ORGANIZATIONAL' THEN contact_organizational_details.name WHEN 'INDIVIDUAL' THEN CONCAT(contact_individual_details.first_name, ' ', contact_individual_details.last_name) END "), $direction ); } }
使用说明
- 基础调用方式和要求完全一致:
Contact::sortByName()->get() - 支持自定义排序方向,倒序调用写法:
Contact::sortByName('desc')->get() - 如果你使用PostgreSQL数据库,把
CONCAT函数替换为contact_individual_details.first_name || ' ' || contact_individual_details.last_name即可 - 如果需要处理关联数据为空的异常情况,可以在CASE语句中添加
ELSE ''的默认值逻辑
内容的提问来源于stack exchange,提问作者Sahil Pahuja
相关产品推荐
相关产品推荐

