как упорядочить записи по лайкам user_id? - PullRequest
0 голосов
/ 04 июля 2019

Я работаю над каким-то приложением laravel, и у меня есть таблица, называемая «записи», я сохраняю в этой таблице рекомендации по названию для конкурса.Мне нужно упорядочить записи, исходя из того, сколько всего пользователей имеет.

это моя таблица:

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();

Мне нужно упорядочить записи по:

заданному значению $test-> id (1-я строка), если запись нравится или нет (2-я строка) записей, где у пользователя больше лайков (глобально), а не текущий конкурс) и от create_at (3-я строка)

Схема:

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(); 
});

вывод команды "show create tabletest_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

, поскольку вы можете видеть, что она показывает только данные изtest_id 1, user_id 2 имеет 5 лайков = true во всех конкурсах, поэтому его записи 1-й, user_id 1имеет 2 понравилось = true, поэтому его записи 2-й .. и продолжайте ...

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

После долгих исследований в конце я создал новую область в модели ContestEntry и соединил 2 запроса, как показано ниже:

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

}
0 голосов
/ 04 июля 2019

Это поможет упорядочить список пользователей, например, в конкретном конкурсе.

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...