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

如何在Scout中按条件排除模型(过滤无名称用户)

问题描述

我的User模型有一个可为空(nullable)的name字段,我希望导入或添加数据时,绝不允许没有名称的用户被创建或加入搜索索引。我尝试了下面的代码,但完全没效果:

public function toSearchableArray()
{
    if (!$this->name) {
        return [
            'name' => $this->name,
            'email' => $this->email,
        ];
    }
}
解决方案

你用错方法了——toSearchableArray只是定义同步到搜索索引的字段集合,没法控制模型是否被创建,也管不了要不要加入索引。分两种场景处理:

1. 彻底阻止无名称用户被创建(覆盖导入/添加场景)

  • 直接在User模型里添加创建拦截钩子:
protected static function boot()
{
    parent::boot();

    static::creating(function ($user) {
        // 空名称直接阻止创建
        if (empty(trim($user->name))) {
            return false;
            // 也可以抛出明确异常:throw new \InvalidArgumentException('用户名称不能为空');
        }
    });
}
  • 如果是用导入工具(比如Laravel Excel),在导入类里加验证规则更直接:
public function rules()
{
    return [
        'name' => 'required|string|min:1', // 强制名称必填且非空
        'email' => 'required|email|unique:users',
    ];
}

2. 允许无名称用户存在,但不让它们进入搜索索引

如果业务允许无名称用户存在,但不想让这类用户出现在搜索结果里,重写shouldBeSearchable方法:

public function shouldBeSearchable()
{
    // 只有名称非空的用户才会被加入搜索索引
    return !empty(trim($this->name));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:37:15