按另一张桌子的数量排序?

0b9*_*4fb 5 php mysql laravel

我有一个表user_room_vists,用于存储每个用户对房间的访问.这是该表的结构以及我如何在自己的数据库中创建它.

DROP TABLE IF EXISTS `user_room_visits`;
CREATE TABLE `user_room_visits` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `room_id` int(10) unsigned NOT NULL,
  `entry_timestamp` double NOT NULL,
  `exit_timestamp` double NOT NULL,
  `hour` int(11) NOT NULL,
  `minute` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `entry_timestamp` (`entry_timestamp`),
  KEY `exit_timestamp` (`exit_timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

然后,我有一个表users,显然持有用户.我正在尝试(按最高顺序)选择用户进行的房间访问次数.

这意味着我必须在比赛user_iduser_room_visitsidusers表,但由于其在一个单独的表就变得复杂起来.

我没有任何例子可以向你展示我尝试过的东西因为我被卡住了,每次我谷歌这都会出现一些我无法解决自己问题的事情,而且事实上我只是不知道我需要做些什么才能实现这一目标.我还需要使用其ORM Equolent在Laravel框架中执行此操作,这使得查询变得更加容易,因此我需要的不仅仅是MySQL.

这是模型文件

class UserRoomVisit extends Model
{
    protected $table = 'user_room_visits';
    public $timestamps = true;
    protected $guarded = ['id'];
}

class User extends Authenticatable
{
    protected $table = 'users';
    public $timestamps = true;
    protected $guarded = ['id'];

    public function userStats() {
        return $this->belongsTo(UserStats::class, 'id');
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nin 0

看起来您不想在这里使用多对多关系。因此,定义模型userRoomVisits中的关系Room

public function userRoomVisits()
{
    return $this->hasMany(UserRoomVisit::class);
}
Run Code Online (Sandbox Code Playgroud)

并使用withCount()这样的方法来获取房间:

Room::withCount(['userRoomVisits' => function($q) {
        $q->where('user_id', auth()->id());
    }])
    ->latest('user_room_visits_count')
    ->get();
Run Code Online (Sandbox Code Playgroud)

更新

评论中提出的另一个问题的代码:

User::withCount('userRoomVisits')->latest('user_room_visits_count')->take(5)->get();
Run Code Online (Sandbox Code Playgroud)

定义模型中的关系User

public function userRoomVisits()
{
    return $this->hasMany(UserRoomVisit::class);
}
Run Code Online (Sandbox Code Playgroud)