我有2个模型,CoreChallenge
和Challenge
。下面是表之间的关系。
我想获取Challenges
有效的core_challenges
。我试图将全局范围放入CoreChallenge
模型中,但是当null
为Corechallenge
时,当我与inactive
建立联系时。
$challenges = Challenge::with('core_challenge')->whereHas('core_challenge', function($q){
$q->where('status', '=', 'active');
})->get();
CoreChallenge
上的全局作用域使我为空,但我希望它的父级(Challenge
)不应该像在whereHas
中那样加载。有什么办法吗?
答案 0 :(得分:0)
我偶然发现了相同的方法,但是当表变大时(在您的方案中为core_challenges_table),whereHas
最终变得非常慢(大约1分钟的响应时间)。
所以我使用了这样的解决方案:
$ids = CoreChallenge::where('status', 'active')->pluck('id');
$challenges = Challenge::with('core_challenges')
->whereIn('core_challenge_id', $ids)
->get();
通过这种方法,我的查询从1分钟减少到600〜ms。
可以翻译成模型作用域
class Challenge {
public function scopeActive($query) {
$activeIds = CoreChallenge::where('status', 'active')->pluck('id');
return $query->whereIn('core_challenge_id', $ids);
}
}
Challenge::with('core_challenges')->active()->get();