Laravel 10 Eloquent HasMany关联添加where like过滤的实现问题
问题解决方法
你的问题出在集合方法和查询构建器方法的混淆上:
当前代码里$user->registrations会直接执行查询,把该用户的所有registrations数据加载到内存中变成Collection实例,之后调用的where是集合的方法,它的匹配逻辑和数据库的LIKE规则不一致,而且是在内存中做过滤,导致达不到你想要的实时模糊查询效果。
正确的做法是使用查询构建器在数据库层面完成过滤,只需要把$user->registrations改成$user->registrations()(加上括号,获取关联的查询构建器实例),再链式调用where条件即可:
public function getSuggestions() { $user = Auth::user(); return $user->registrations() ->where('registration', 'like', '%' . $this->search . '%') ->get(); }
额外优化建议
如果你的Laravel版本是9及以上,可以用更简洁的whereLike方法简化代码:
public function getSuggestions() { return Auth::user()->registrations() ->whereLike('registration', "%{$this->search}%") ->get(); }
另外,建议处理$this->search为空的情况,避免不必要的模糊查询:
public function getSuggestions() { $query = Auth::user()->registrations(); if ($this->search) { $query->where('registration', 'like', '%' . $this->search . '%'); } return $query->get(); }
内容的提问来源于stack exchange,提问作者DeveloperChris
相关产品推荐
相关产品推荐

