считать регистрации в конференциях, где цена типа регистрации> 0 - PullRequest
0 голосов
/ 02 июля 2018

У меня есть запрос для подсчета количества регистраций в конференции:

    $registrationsCount = $conference->registrations->count();

Но я хочу получить только регистрации на конференциях, связанных с типами регистрации, цена которых> 0. Знаете ли вы, как этого добиться? Например, если конференция «тестовая конференция» имеет два типа регистрации «rt1 и rt2», цена rt1 равна 0, а цена rt2 равна 10 и в типе регистрации «rt2» есть 5 регистраций, запрос должен вернуть 5 потому что в конференции 5 платных регистраций.

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

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

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

Модель регистрации:

 public function registration_types(){
        return $this->belongsToMany('App\RegistrationType', 'registration_registration_types');
    }


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

Тип регистрации модель:

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

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

Модель участников:

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


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

структура таблиц:

conferences: id, name
registrations: id, status, conference_id, user_that_did_registration
registration_types: id, name, price, conference_id 
participants: id, registration_id, registration_type_id, name

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Если честно, я не до конца понял ваш запрос, но вижу следующие две возможности:

Conference::whereHas('registrationTypes', function ($query) {
        $query->where('price', '>', 0);
    })
    ->withCount('registrations')
    ->get();

// will give you something like this
[
  {
    "id": 1,
    "name": "Laracon",
    "registrations_count": 100
  }
]

или, альтернативно, вы можете выполнить проверку цены в пределах счета

Conference::withCount(['registrations' => function ($query) {
        $query->whereHas('registration_types', function ($query) {
            $query->where('price', '>', 0);
        });
    }])
    ->get();
0 голосов
/ 02 июля 2018

Вы можете сделать это так:

$count = Registration::whereHas('registration_types', function($q) use($user) {
                            $q->where('price ', '>', 0);
                        })
                    ->where('conference_id', $conferenceId)
                    ->count();
0 голосов
/ 02 июля 2018

Попробуйте этот код

$conference->registrations->sum(function ($registration) {
    $registrationTypes = $registration->registration_types->where('price', '>', 0);
    return $registrationTypes ? $registrationTypes->count() : 0;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...