按另一个表的计数排序?

时间:2018-03-03 10:17:57

标签: 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;

然后我有一个名为users的表,它显然拥有用户。我试图选择(按最高顺序)用户进行的房间访问次数。

这意味着我必须将user_id中的user_room_visits列与id表中的users列进行匹配,但因为它在单独的表中会变得复杂。

我还没有任何示例向您展示我尝试过的内容,因为我已经陷入困境,每次我谷歌时都会提出一些我无法解决的问题我自己的问题,以及我不知道自己需要做些什么来实现这个目标。我还需要在Laravel框架中使用它的ORM Equolent来实现这一点,这使得查询变得更加容易,所以我需要的不仅仅是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');
    }
}

1 个答案:

答案 0 :(得分:0)

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

public function userRoomVisits()
{
    return $this->hasMany(UserRoomVisit::class);
}

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

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

<强>更新

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

User::withCount('userRoomVisits')->latest('user_room_visits_count')->take(5)->get();

User模型中定义关系:

public function userRoomVisits()
{
    return $this->hasMany(UserRoomVisit::class);
}