如何按喜欢的user_id排序条目?

时间:2019-07-04 14:08:44

标签: laravel eloquent

我正在开发一些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 ..并继续...

2 个答案:

答案 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);

}