Laravel关联数据库查询及关联模型字段搜索方法问询
在Laravel中基于关联模型字段查询的正确姿势
嘿,这个问题我太懂啦!你直接写where('category->name', 'like', '%'.$keyword.'%')肯定行不通的——因为category->name是Eloquent把关联的Category模型序列化之后才有的属性,数据库里根本不存在这个字段哦~
要实现基于关联分类名称的查询,得用Laravel专门提供的whereHas方法,它就是用来针对关联模型的字段添加查询条件的。下面一步步给你讲怎么做:
1. 先确认关联关系定义正确
首先确保你的Post模型里已经正确定义了和Category模型的关联,比如如果是一篇文章属于一个分类,关联方法应该是这样的:
// app/Models/Post.php public function category() { return $this->belongsTo(Category::class); }
2. 修改查询逻辑,用whereHas关联查询
接下来把你的搜索查询改成这样:
return $q->where('title', 'like', '%'.$keyword.'%') // 要是需要「标题包含关键词 OR 分类名包含关键词」,就用orWhereHas ->orWhereHas('category', function ($subQuery) use ($keyword) { $subQuery->where('name', 'like', '%'.$keyword.'%'); });
如果你的需求是同时满足标题和分类名都包含关键词,那就把orWhereHas换成whereHas就行。
小补充:避免N+1查询问题
如果你的查询最终需要返回包含分类数据的Post对象,记得在查询开头加上with('category'),这样可以一次性加载所有关联的分类,避免N+1性能问题:
Post::query() ->with('category') ->where(function ($q) use ($keyword) { $q->where('title', 'like', '%'.$keyword.'%') ->orWhereHas('category', function ($subQuery) use ($keyword) { $subQuery->where('name', 'like', '%'.$keyword.'%'); }); }) ->get();
内容的提问来源于stack exchange,提问作者Filip Blaauw
相关产品推荐
相关产品推荐

