Intereting Posts
Извлечение XML-данных в MySQL Как получить значения из массива с помощью метода POST Контроллеры двигателей выражений Как использовать переменные PHP, заключенные в двойном проценте (%% variable %%) внутри html Ошибка SMTP Connect (). Сообщение не отправлено. Ошибка отправителя: Ошибка SMTP Connect () Есть ли ограничение на длину запроса в mysql? Нужно регулярное выражение, которое проверяет, содержат ли строки только буквы az и числа и подчеркивание (_) и дефис (-) Как добавить пользователя в пользовательскую аудиторию facebook Как запустить программу PHP из командной строки на Windows-машине? Возможно ли запускать .php-файлы на моем локальном компьютере? Как вернуть переменную javascript в Ajax? Получение имени столбца из индексов строк и столбцов в PHPExcel Обязательное полевое сообщение об ошибке на форме Как печатать не пустые значения на php Amazon S3 избегает перезаписи объектов с тем же именем

Счетчик отношений Laravel OrderBy

Я пытаюсь получить самые популярные хакатоны, которые требуют упорядочения соответствующими участниками хакафона – partipants->count() . Извините, если это немного сложно понять.

У меня есть база данных со следующим форматом:

 hackathons id name ... hackathon_user hackathon_id user_id users id name 

Модель Hackathon :

 class Hackathon extends \Eloquent { protected $fillable = ['name', 'begins', 'ends', 'description']; protected $table = 'hackathons'; public function owner() { return $this->belongsToMany('User', 'hackathon_owner'); } public function participants() { return $this->belongsToMany('User'); } public function type() { return $this->belongsToMany('Type'); } } 

И HackathonParticipant определяется как:

 class HackathonParticipant extends \Eloquent { protected $fillable = ['hackathon_id', 'user_id']; protected $table = 'hackathon_user'; public function user() { return $this->belongsTo('User', 'user_id'); } public function hackathon() { return $this->belongsTo('Hackathon', 'hackathon_id'); } } 

Я пробовал Hackathon::orderBy(HackathonParticipant::find($this->id)->count(), 'DESC')->take(5)->get()); но я чувствую, что совершил большую ошибку (возможно, $ this-> id), потому что он вообще не работает.

Как я могу попытаться получить самые популярные хакафоны, которые основаны на наибольшем числе связанных участников hackathonParticipants?

Related of "Счетчик отношений Laravel OrderBy"

Вы должны иметь возможность использовать sortBy() и count() в Collection чтобы сделать это довольно легко.

 $hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon) { return $hackathon->participants->count(); }); 

Это работает для меня в Laravel 5.3, используя ваш пример:

 Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10); 

Таким образом, он упорядочен по запросу, а разбиение на страницы работает красиво.

У меня была аналогичная проблема, и использование sortBy () не подходит из-за разбивки на страницы, как Сабрина Гелбарт прокомментировала предыдущее решение. Поэтому я использовал db raw, вот упрощенный запрос:

 Tag::select( array( '*', DB::raw('(SELECT count(*) FROM link_tag WHERE tag_id = id) as count_links')) )->with('links')->orderBy('count_links','desc')->paginate(5); 

Другим подходом может быть использование withCount() .

 Hackathon::withCount('participants') ->orderBy('participants_count', 'desc') ->paginate(50); 

Ссылка: https://laravel.com/docs/5.5/eloquent-relationships#querying-relations

Вы также можете использовать оператор объединения. Как сказала Сабрина, вы не можете использовать sortby на уровне db.

 $hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id') ->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`') ->groupBy('hackathon.id') ->orderBy('count','DESC') ->paginate(5); 

Но этот код принимает все записи из базы данных. Поэтому вы должны разбиваться на страницы вручную.

  $hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id') ->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`') ->groupBy('hackathon.id') ->orderBy('count','DESC') ->skip(0)->take(5)->get(); 

Ссылка на: https://stackoverflow.com/a/26384024/2186887