Ошибка в построителе запросов laravel

Мой построитель запросов Laravel возвращает значение null:

    $country = DB::table('participate_company')

        ->join('company', 'company.company_id', '=', 'participate_company.company_id')
        ->join('country', 'country.country_id', '=', 'company', 'company.country_id')
        ->join('competition', 'competition.competition_id', '=', 'participate_company.competition_id')

        ->select('country.country_name', DB::raw('COUNT(company.country_id) as total'))
        ->groupBy('company.country_id')
        ->groupBy('country.country_name')
        ->get();

Дизайн таблицы:

<б>1. Участвовать_компания

id соревнования (pk/fk)
company_id (pk/fk)

<б>2. компания

company_id (pk)
company_name
country_id (fk)

<б>3. страна

country_id (pk)
имя_страны

<б>4. конкурс

id_соревнования (pk)
_год_соревнования

Я хочу получить результат подсчета отдельной страны на основе года соревнований. Например, год соревнований = 2012, имя_страны = Англия, количество (всего) = 20. Но мой текущий запрос возвращает значение null.

SQLFiddle: http://sqlfiddle.com/#!9/a2092f/1


person Firdaus    schedule 09.07.2018    source источник
comment
Поместите выборку ваших данных на скрипку, и я буду рад взглянуть на нее. Спасибо...   -  person hd1    schedule 09.07.2018
comment
@ hd1 Я отредактировал свой пост и добавил скрипку sql ... пожалуйста, взгляните на нее, спасибо   -  person Firdaus    schedule 10.07.2018
comment
какие результаты вы ожидаете от этого запроса? Я смог получить Англию   -  person hd1    schedule 10.07.2018


Ответы (1)


Я предлагаю использовать связь Laravel ORM и Eager Loading, чтобы решить эту проблему. В модели компании мы бы определили country()method:

public function country() {
       return $this->belongsTo(Country::class, 'country_id', 'id');
}

В модели конкуренции определите метод

public function company() {
       return $this->belongsToMany(Company::class);
}

Итак, в контроллере вы можете вызвать groupBy :

Competition::with('company:id,country_id')->get()->groupBy('year');

Мы поймаем country_id в каждом company, который есть в relations из years. Я только что протестировал простой пример, после чего мы будем перебирать эту коллекцию и считать их.

Простой пример

Надеюсь, это полезно.

П/с. При использовании моделями имена моей таблицы: companies, countries, competitions, company_competition

person Cong LB    schedule 10.07.2018