You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:15:04