我想显示一个用户按其排名列出的页面。排名可以有多个用户(例如,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
表,其中包含id
,rank_id
,user_id
和created_at
字段。
这是我在数据库中记录的方式:
$user->ranks()->attach($rank_id, ['created_at' => Carbon::now()->addMinutes(105)]);
为了按排名列出用户,我的意思是当前(最近的)排名,这就是我所拥有的:
$ranks = Rank::with('users')->get();
例如,对于第一个排名,它给了我从一开始就排在第一位的所有用户,而不是给我所有当前位于第一位的用户。
我不知道如何将查询限制在最近的日期。
答案 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();
瞧!通过这种方式,我只获得每个级别中最近的用户。