Laravel约束预加载返回全部条目,匹配项关联正常其余为null如何解决
问题原因
你当前使用的with()闭包仅用于约束关联数据的预加载结果,不会对主表Poster的查询范围做过滤,因此会返回所有Poster条目,仅不符合条件的条目关联的author被置为null,符合你现在遇到的现象。
解决方案
需要搭配whereHas()方法,约束仅返回关联author满足搜索条件的Poster条目,同时你原有代码还存在两处逻辑错误:调用get()后再调用paginate()无效、dd()会中断代码执行无法完成后续渲染。
修正后的代码如下:
class PosterData extends Component { use WithPagination; protected $paginationTheme = 'bootstrap'; public $search = 'exampleName'; public function render() { $search = $this->search; $posters = Poster::whereHas('author', function ($query) use($search) { // 这里的约束用来过滤主表Poster,仅保留关联author符合条件的条目 $query->where('name', 'like', '%'. $search . '%'); }) ->with(['author' => function ($query) use($search) { // 这里的约束用来保证预加载的author数据也符合搜索条件,因whereHas已过滤主表,也可简化为直接写with('author') $query->where('name', 'like', '%'. $search . '%'); }]) ->paginate(10); return view('livewire.poster-data', [ 'posters' => $posters, ]); } }
改动说明
- 新增
whereHas()方法:对主表查询做约束,仅返回关联author满足name字段匹配搜索词的Poster条目,从根源上过滤掉不符合要求的主表数据 - 移除了
get()和dd()调用:get()会直接执行查询返回集合,后续无法再调用分页方法paginate(),dd()会中断代码执行导致页面无法正常渲染 - 保留
with()中的关联约束:也可以简化为直接写->with('author'),因为whereHas已经保证所有返回的Poster对应的author都符合搜索条件
内容的提问来源于stack exchange,提问作者BootDev
相关产品推荐
相关产品推荐

