Запрос с подсчетом и группировкой по eloquent - PullRequest
0 голосов
/ 25 июня 2018

Я хочу иметь таблицу в представлении, которая показывает все типы регистрации, связанные с конференцией, цену каждой и количество проданных регистраций каждого типа регистрации.

Например, если конференция с идентификатором «1» имеет два типа регистрации с этими столбцами и значениями:

  • rtype1 (имя), 0,00 $ (цена), 20 (емкость)
  • rtype2 (имя), 5,00 $ (цена), 10 (емкость)

И в rtype1 зарегистрировано 20 участников, а в rtype 2 - 5. Я хочу показать таблицу вроде:

Registration Type name               Price           Sold/capacity 
rtype1                               0.00$              20/20
rtype2                               5.00$              5/10

Я не понимаю, как этого добиться. На данный момент у меня есть этот запрос, чтобы получить каждый тип регистрации и количество каждого типа регистрации:

$participantsOfEachType = Participant::
 select(DB::raw('registration_type_id, count(registration_type_id)'))
->groupBy('registration_type_id')->get();

Этот запрос возвращает результаты ниже. Но не рассматривает конкретную конференцию. Знаете ли вы, что необходимо учитывать для конкретного идентификатора конференции, чтобы можно было показать результаты в виде таблицы, как в приведенном выше примере таблицы?

Collection {#271 ▼
  #items: array:2 [▼
    0 => Participant {#282 ▼
    ...
      #attributes: array:2 [▼
        "registration_type_id" => 1
        "count(registration_type_id)" => 2
      ]
    ...
    }
    1 => Participant {#279 ▼
    ...
      #attributes: array:2 [▼
        "registration_type_id" => 2
        "count(registration_type_id)" => 2
      ]
      ... 
    }
  ]
}

Соответствующие модели на вопрос:

Модель пользователя:

public function registrations(){
    return $this->hasMany('App\Registration','user_that_did_registration');
}

Регистрационная модель:

// user that did the registration
public function customer(){
    return $this->belongsTo(User::class, 'user_that_did_registration', 'id');
}
 public function participants(){
    return $this->hasMany('App\Participant');
}

public function conference(){
    return $this->belongsTo('App\Conference');
}

Модель конференции:

 public function registrations(){
    return $this->hasMany('App\Registration', 'conference_id');
}

Режим участников:

public function registration(){
    return $this->belongsTo('App\Registration');
}

public function registration_type(){
    return $this->belongsTo('App\RegistrationType');
}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я предполагаю, что ваша RegistrationType модель имеет следующие сопоставления

Class RegistrationType Extends Model{

    public function participants(){
        $this->hasMany('App\Participants','registration_type_id')
    }

}

Тогда для ожидаемого результата вы можете получить данные как

$conference_id = 1;

$registrationTypes = RegistrationType::withCount('participants')
                                    ->whereHas('participants.registration.conference',function($query) use ($conference_id){
                                        $query->where('id','=', $conference_id)
                                    });
                                    ->get();

Когда вы просматриваете результаты в каждой строке в$registrationTypes будет иметь атрибут participants_count, который даст вам количество участников для этого типа регистрации.

См. Разделы Подсчет связанных моделей и запрос наличия отношений

0 голосов
/ 25 июня 2018

попробуй
select conference_id, group_concat(concat_ws(':', registration_type_id, cnt)) from (select conference_id, registration_type_id, count(*) as cnt from t group by conference_id, registration_type_id ) tm group by conference_id order by conference_id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...