Laravel:具有ManyToMany关系的历史排名系统

时间:2016-06-13 21:30:53

标签: php laravel

我想显示一个用户按其排名列出的页面。排名可以有多个用户(例如,2个用户可以位于第二位),用户也可以拥有多个排名,因为我希望保持历史悠久的用户和排名。

这是User.php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    // ...

    public function Ranks() {
        return $this->belongsToMany('App\Rank');
    }
}

Rank.php     

namespace App;

use Illuminate\Database\Eloquent\Model;

class Rank extends Model
{
    public $timestamps = false;

    public function Users() {
        return $this->belongsToMany('App\User')->withPivot('created_at');
    }
}

我的数据库中还有一个rank_user表,其中包含idrank_iduser_idcreated_at字段。

这是我在数据库中记录的方式:

$user->ranks()->attach($rank_id, ['created_at' => Carbon::now()->addMinutes(105)]);

为了按排名列出用户,我的意思是当前(最近的)排名,这就是我所拥有的:

$ranks = Rank::with('users')->get();

例如,对于第一个排名,它给了我从一开始就排在第一位的所有用户,而不是给我所有当前位于第一位的用户。

我不知道如何将查询限制在最近的日期。

1 个答案:

答案 0 :(得分:0)

我问过我的一位朋友,这是我们找到的解决方案:

我首先必须将最新日期包含在rank_user数据透视表中。

$date = DB::table('rank_user')->select('created_at')
                              ->orderBy('created_at', 'desc')
                              ->first();

然后,我可以使用withPivot()来指定我只想查看我们之前找到的最新日期的结果:

$ranks = Rank::with(['users' => function($query) use ($date) {
    $query->wherePivot('created_at', $date->created_at);
}])->get();

瞧!通过这种方式,我只获得每个级别中最近的用户。