如何实现Laravel模型及其一对多关联模型的字段字符串模糊搜索
Laravel 关联模型搜索实现方案
报错原因
你代码报错的核心原因是:查询构造器阶段不能直接调用关联动态属性。->files是Article模型实例的动态属性,只能在你已经获取到单条Article数据后用来读取它关联的所有文件,不能直接拼在查询构造器的链式调用里做过滤。
正确实现代码
public function ajax_article_search() { $value = $_POST['value']; $html = ''; if($value) { $articles = Article::where(function ($query) use ($value) { // 匹配文章自身标题 $query->where('title', 'like', '%'.$value.'%') // 匹配文章自身描述 ->orWhere('description', 'like', '%'.$value.'%') // 匹配关联文件的文件名 ->orWhereHas('files', function ($fileQuery) use ($value) { $fileQuery->where('filename', 'like', '%'.$value.'%'); }); })->get(); foreach($articles as $article) { $html .= '<a href="'.$article->url.'">'; $html .= '<p>'.$article->title.'</p>'; $html .= '</a>'; } } echo $html; }
代码说明
- 用
whereHas('关联名', 闭包)方法实现关联表过滤,会自动筛选出「关联表中存在符合闭包内条件数据」的Article记录 - 外层套了一层
where闭包做逻辑分组,避免后续如果有其他全局查询条件(比如软删除过滤、权限过滤)时,or条件逻辑混乱 - 三个匹配条件是或的关系,满足任意一个就会被查询出来,完全符合需求
- Laravel环境下更推荐用
request()->input('value')替代原生$_POST获取参数,会自动处理XSS过滤和参数不存在的异常,也可额外增加关键词长度校验避免无意义查询
内容的提问来源于stack exchange,提问作者Citizen6022140857
相关产品推荐
相关产品推荐

