【问题标题】:Eloquent get user with highest relation table pointsEloquent 获取关系表点数最高的用户
【发布时间】:2021-04-09 16:25:57
【问题描述】:

我正在尝试根据魅力和说服力让用户获得最高评价分

在此之后我写的到目前为止我无法弄清楚如何使它工作

    $user = User::where('commision_id', $data['commision'])->whereHas('role', function ($q) {
        $q->where('level', 2);
    })->with(['evaluations' => function ($q) {
        
    }]);

评估关系迁移

    Schema::create('evaluations', function (Blueprint $table) {
        $table->id();
        $table->boolean('charisma')->default(false); 
        $table->boolean('persuasion')->default(false);
        $table->boolean('politics')->default(false);
        $table->boolean('heat')->default(false);
        $table->string('title');
        $table->integer('hl')->nullable();
        $table->integer('exp')->nullable();
        $table->unsignedBigInteger('user_id');
        $table->timestamps();

        $table->index('user_id');
    });

所以基本上我必须将基于说服力的 exp 点和基于魅力的 exp 点相加,然后将这两个总和值相加以获得最高排名的用户。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    您可以即时将这 2 个属性相加,然后简单地获得具有最高属性的那个。

    $user = User::where('commision_id', $data['commision'])->whereHas('role', function ($q) {
        $q->where('level', 2);
    })->with(['evaluations'])
    ->get()
    ->each(function ($u) { 
        $u->score = $u->evaluations->charisma + $u->evaluations->persuasion
    });
    
    $topUser = $user->orderBy('score')->first();
    

    如果一个用户可以有很多评价,你会做类似的事情:

    ->each(function ($u) { 
         $u->score = null;
         $charisma  = $u->evaluations->pluck('charisma')->sum();
         $persuasion = = $u->evaluations->pluck('persuasion')->sum();
         $u->score += $charisma;
         $u->score += $persuasion ;
     });
    

    【讨论】:

    • 该代码将不起作用,因为charismapersuasianevaluations 上的属性而不是用户,因此每个功能都会失败。
    • 我更新了我的答案。假设您在 User 模型中设置了适当的关系,您可以像从应用程序的任何其他位置访问它一样访问它。
    • Charisma 和 Persuasion 是布尔值,应该计算的值是 exp,所以必须有一个 if 语句来检查 Charisma 或 Persuasion 是否为真并计算 exp。用户有很多评价。感谢您的努力。
    • 你仍然可以做同样的事情,只是在 pluck 之后使用 ->filter(),比如 $u->evaluations->pluck('persuasion')->filter()->sum() ;
    • 我必须做这样的事情 $persuasion = $u->evaluations->pluck('persuasion', 'exp');并将说服布尔值为真时的 exp 相加。
    【解决方案2】:

    它的工作原理是使用过滤器功能来过滤魅力和说服力的布尔值,感谢 N L 为我指明了正确的方向,我接受了他的回答。

        $user = User::where('commision_id', $data['commision'])->whereHas('role', function ($q) {
            $q->where('level', 2);
        })->with(['evaluations'])
        ->get()
        ->each(function ($u) { 
            $u->score = null;
            
            $charisma  = $u->evaluations->filter(function($value) {
                return $value->charisma == true;
            })->sum('exp');
    
            $persuasion = $u->evaluations->filter(function($value) {
                return $value->persuasion == true;
            })->sum('exp');
            
            $u->score += $charisma;
            $u->score += $persuasion;
        })->sortByDesc('score')->first();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      相关资源
      最近更新 更多