Lumen 5.5中WhereHas调用关联模型作用域失效问题排查
嘿,我来帮你排查这个问题!你遇到的情况是Post模型里的whereHas没正确触发User模型的作用域,其实大概率是两个小细节没处理好:
1. 关联关系的参数写错了
你看Post模型里的belongsTo方法:
public function user() { return $this->belongsTo('App\User', 'user-id', 'user-id'); }
第三个参数是指定User模型的主键,但如果你的User模型用的是Laravel默认的id作为主键(而不是user-id),那这里就错了!错误的关联会导致whereHas根本找不到对应的User记录,自然作用域的条件就没生效。
改成下面这样就对了(省略第三个参数,默认使用User模型的主键):
public function user() { return $this->belongsTo('App\User', 'user-id'); }
2. whereHas的闭包需要返回修改后的查询构建器
虽然Laravel的查询构建器是链式调用,但在whereHas的闭包里调用作用域时,最好明确返回修改后的查询实例,确保条件被正确应用:
修改Post模型的scopeActive方法:
public function scopeActive() { return $this->where('status', '=', '1')->whereHas('user', function($q) { // 这里加上return,把作用域修改后的查询返回出去 return $q->activeUser(); }); }
额外的代码优化(可选)
User模型里的日期处理可以用Carbon来替代原生的date函数,更优雅还能避免时区问题:
// 先引入Carbon use Carbon\Carbon; public function scopeActiveUser() { return $this->whereDate('seen', '>=', Carbon::now()->subMonth()); }
这样调整后,你的作用域应该就能正常触发了!
内容的提问来源于stack exchange,提问作者Michał
相关产品推荐
相关产品推荐

