【问题标题】:Use Model Function In Laravel Query在 Laravel 查询中使用模型函数
【发布时间】:2020-10-14 12:14:50
【问题描述】:

我该如何解决这个问题 我想选择已经进入锦标赛的用户,并且我在我的用户模型中使用 hasEnteredTournament 函数也知道

这是用户模型:

public function scopeHasEnteredTournament($query){
    $active = Order::all()
        ->where('user_id','=',$this->id)
        ->where('status','=',1)
        ->where('pack_id','=',3)
        ->where('expired_at','>',now())
        ->first();
    $tournament = Tournament::all()
        ->where('status','=',1)
        ->where('start_at','<',now())
        ->where('end_at','>',now())
        ->first();
    if($active && $tournament){
        return true;
    }
    return false;
}

这是我的控制器代码:

$all = User::all()
        ->sortByDesc('tournamentPoints')
        ->where('hasEnteredTournament')
        ->take(200);

非常感谢

【问题讨论】:

  • 尽量避免使用 ::all() 这么多...这样做会从数据库中取出每一行并将其作为 Collection (Laravel 中的 PHP 数组包装器)放入内存中,然后是每个附加函数需要修改Collection。这是难以置信地低效的。与User::orderBy('tournamentPoints', 'DESC')-&gt;where(...)-&gt;limit(200)-&gt;get(); 进行比较。这是相同的输出,但使用的是您的数据库而不是 PHP 内存,相比之下,效率非常

标签: php laravel eloquent


【解决方案1】:

由于您使用集合,您可以使用filter 方法:
https://laravel.com/docs/8.x/collections#method-filter

【讨论】:

    【解决方案2】:

    就这样用吧……

    $all = User::all()
            ->sortByDesc('tournamentPoints')
            ->hasEnteredTournament()
            ->take(200);
    

    更多信息请看这里https://laravel.com/docs/8.x/eloquent#local-scopes

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2017-05-10
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多