Laravel中使用whereHas与find函数查询异常问题求助
问题分析与解决方案
你的代码问题出在这几点:
find($eventId)会直接返回单个Event模型实例,后续链式调用的whereHas只是用来验证该Event是否存在active=1的EventInfo关联,但不会过滤关联的EventInfo数据。所以当你访问这个Event的EventInfo关联时,依然会取出所有相关记录,不管active值是0还是1。whereHas的作用是筛选「拥有符合条件关联模型」的主模型,而非过滤关联模型本身的数据集。
正确写法
如果你想获取指定eventId的Event实例,同时只加载其关联中active=1的EventInfo数据,应该用with()方法来约束关联加载:
use Illuminate\Database\Eloquent\Builder; $event = Event::with(['EventInfo' => function (Builder $query) { $query->where('active', 1); }])->find($eventId);
这样处理后,$event->EventInfo只会返回active字段为1的关联记录。
如果你的需求是筛选出所有拥有至少一条active=1的EventInfo的Event实例(而非单个指定ID),可以结合whereHas和with:
$events = Event::with(['EventInfo' => function (Builder $query) { $query->where('active', 1); }])->whereHas('EventInfo', function (Builder $query) { $query->where('active', 1); })->get();
内容的提问来源于stack exchange,提问作者HuA
相关产品推荐
相关产品推荐

