我正在开发一些laravel应用,并且有一个名为“ entries”的表,我在表中保存了比赛名称的建议。我需要根据用户总数来排序条目。
这是我的桌子
id user_id contest_id name liked
1 1 1 test.com true
2 4 1 cool.com false
3 1 1 code.com true
4 3 1 tool123.com false
5 2 1 a23423.com true
6 3 1 dole.net true
7 1 1 great.com false
8 2 1 domain.com true
9 2 1 gol.com false
10 2 1 greatcode.com true
11 2 2 greatco.com true
12 2 2 greatmap.com true
这就是我所拥有的:
$entries = ContestEntry::where('contest_id', '=', $contest->id)
->orderBy('liked', 'desc')
->orderBy('created_at', 'desc')
->get();
我需要通过以下方式订购条目:
给定的$ contest-> id(第一行) 是否喜欢该条目(第二行) 输入用户有更多喜欢的地方(全球范围内,而不是当前比赛) 并通过created_at(第三行)
模式:
Schema::create('contest_entries', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->integer('contest_id');
$table->text('name');
$table->text('comment')->nullable();
$table->boolean('liked')->default(false);
$table->boolean('available')->default(true);
$table->timestamp('checked_at');
$table->timestamps();
});
“显示创建表race_entries”的输出:
CREATE TABLE `contest_entries` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`contest_id` int(11) NOT NULL,
`name` text COLLATE utf8mb4_unicode_ci NOT NULL,
`comment` text COLLATE utf8mb4_unicode_ci,
`liked` tinyint(1) NOT NULL DEFAULT '0',
`available` tinyint(1) NOT NULL DEFAULT '1',
`checked_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
我需要的是下面的表格:
id user_id contest_id name liked
5 2 1 a23423.com true
8 2 1 domain.com true
9 2 1 gol.com false
10 2 1 greatcode.com true
1 1 1 test.com true
3 1 1 code.com true
7 1 1 great.com false
4 3 1 tool123.com false
6 3 1 dole.net true
2 4 1 cool.com false
如您所见,它仅显示来自race_id 1的数据,user_id 2在所有竞赛中具有5 Liked = true,这就是为什么其条目为1st,user_id 1具有2 Liked = true,这就是为什么其条目为2nd ..并继续...
答案 0 :(得分:0)
这将有助于在特定比赛中按喜欢排序用户列表。
$entries = DB::table('contest_entries')
->where('contest_id', '=', $contest->id)
->where('liked',true)
->select('user_id', DB::raw('count(*) as total'))
->groupBy('user_id')
->orderByDesc('total')
->get();
答案 1 :(得分:0)
经过大量研究,最后我要做的是在ContestEntry模型中创建一个新范围,并结合以下两个查询:
public function scopeOrderByLikes($query){
$order = ContestEntry::select('user_id', \DB::raw('count(*) as total'))
->groupBy('user_id')
->orderByDesc('total')
->pluck('user_id');
return $query->orderBy('user_id',$order);
}