在Laravel中通过全局范围重构在何处使用

时间:2019-03-24 19:50:30

标签: laravel-5 eloquent relationship

我有2个模型,CoreChallengeChallenge。下面是表之间的关系。 relation between tables

我想获取Challenges有效的core_challenges。我试图将全局范围放入CoreChallenge模型中,但是当nullCorechallenge时,当我与inactive建立联系时。

我已经这样做了

$challenges = Challenge::with('core_challenge')->whereHas('core_challenge', function($q){
            $q->where('status', '=', 'active');
        })->get();

我想使用全局作用域

CoreChallenge上的全局作用域使我为空,但我希望它的父级(Challenge)不应该像在whereHas中那样加载。有什么办法吗?

1 个答案:

答案 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();