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

Laravel Filament 3.x表单构建器:筛选唯一firstName的客户

解决Laravel Filament 3.x Select组件只显示唯一firstName客户的问题

你当前使用的distinct()方法未生效,原因是该方法会基于所有字段判断记录唯一性——只要客户记录中有任意字段(比如id、last_name)不同,即使first_name重复,也会被视为不同记录返回。要实现仅展示firstName唯一的客户,需调整查询逻辑,确保每个first_name只对应一条客户记录,以下是几种可行方案:

方案1:通用子查询法(适配所有数据库)

通过子查询获取每个first_name对应的最小(或最大)客户ID,再基于这些ID筛选客户,确保每个first_name仅出现一次:

use App\Models\Client;
use Illuminate\Database\Eloquent\Builder;

Select::make('client_id')
    ->relationship('client', 'first_name', function (Builder $query) {
        // 子查询:按first_name分组,取每组最小的客户ID
        $uniqueClientIds = Client::selectRaw('MIN(id) as id')
            ->groupBy('first_name')
            ->pluck('id');
            
        $query->whereIn('id', $uniqueClientIds);
    });

方案2:分组查询(需调整数据库模式)

若你的数据库未开启ONLY_FULL_GROUP_BY严格模式,可直接按first_name分组并指定查询字段:

Select::make('client_id')
    ->relationship('client', 'first_name', function (Builder $query) {
        $query->select('id', 'first_name')
            ->groupBy('first_name');
    });

注意:开启ONLY_FULL_GROUP_BY时,该方法会触发SQL错误,因为id未包含在分组字段中。

方案3:PostgreSQL专属方案

若使用PostgreSQL,可利用distinctOn()方法直接按first_name去重:

Select::make('client_id')
    ->relationship('client', 'first_name', function (Builder $query) {
        $query->distinctOn('first_name');
    });

内容的提问来源于stack exchange,提问作者Billal BEGUERADJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:11