Как получить строку с двумя или более конкретными условиями? - PullRequest
0 голосов
/ 20 февраля 2019

ApplicantTbl

id | name          |
--------------------
 1 | John Doe      |
 2 | Maria Ozawa   |
 3 | Catriona Gray |
--------------------

EnrollmentRequestContentTbl

id |  applicant_id | payment_status  |   enrollment_status   |
--------------------------------------------------------------
 1 |       1       |     pending     |        null           |
--------------------------------------------------------------

Моя цель состоит в том, чтобы получить всех заявителей, включая Applicant_id 1 if:

  1. The payment_status на enrollmentRequestContentTbl равно оплачено
  2. payment_status на enrollmentRequestContentTbl равно неоплачено , а enrollment_status равно back_out или declined

Остальное возможное условие будет проигнорировано и не сможет быть получено из моего запроса.

В приведенной выше таблице будет игнорироваться заявитель 1, поскольку payment_status равно pending.

Если EnrollmentRequestContentTbl будет выглядеть так

 id |  applicant_id | payment_status  |   enrollment_status   |
 --------------------------------------------------------------
 1 |       1        |     paid        |        null           |
 --------------------------------------------------------------

или так.Поскольку paymet_status является неоплаченным enrollment_status должно быть back_out или отклонено

 id |  applicant_id | payment_status  |   enrollment_status   |
 --------------------------------------------------------------
 1 |       1        |     unpaid      |        back_out       |
 --------------------------------------------------------------

-

 id |  applicant_id | payment_status  |   enrollment_status   |
 --------------------------------------------------------------
 1 |       1        |     unpaid      |        declined       |
 --------------------------------------------------------------

Заявитель 1 будет включен в мой запрос и показан в моем списке.

- ApplicantModel

public function enrollmentRequestContent()
{
   return $this->hasMany('App\EnrollmentRequestContent');
}

EnrollmentRequestContentModel

public function applicant()
{
   return $this->belongsTo('App\Applicant')
}

Пока что это то, что я пробовал.

Контроллер

public function getApplicant()
{
    $applicants = Applicant::orWhereDoesntHave('enrollmentRequestContent', function($q){
        $q->where('payment_status', '!=', 'paid')
            ->where(function($qq) {
                $qq->where('payment_status', '!=', 'unpaid')
                        ->whereIn('enrollment_status', ['declined', 'back_out']);
            });
    })->get();   

    return $applicants;
}

Я использую красноречивый запрос laravel.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы можете попробовать приведенный ниже код удовлетворит ваши условия.

public function getApplicant()
{
      $applicants = Applicant::with(['enrollmentRequestContent'])
                ->whereHas('enrollmentRequestContent', function($query){
                    $query->where(function($q){
                        $q->whereIn('payment_status', ['declined', 'back_out'])
                         ->where('payment_status', '!=','unpaid');
                    });
                    $query->orWhere('payment_status', '!=', 'paid');
                })

     return $applicants;
}
0 голосов
/ 20 февраля 2019

Ты на самом деле близко.Вам просто нужно изменить логику, вот что я сделал:

Сначала получите всех кандидатов, которых нет в pivot table, с помощью whereDoesntHave.

Далее - получить всех кандидатов, которые существуют в pivot table , только если его статус «оплачен» (с помощью orWhereHas) или его статус «не оплачен, но его статус регистрации должен быть либо «back_out», либо «отклонен» (с помощью orWhereHas с whereIn).

$data = Applicant::whereDoesntHave('enrollmentRequestContents')
    ->orWhereHas('enrollmentRequestContents', function($q1){
        $q1->where('payment_status', 'paid');
    })
    ->orWhereHas('enrollmentRequestContents', function($q2){
        $q2->where('payment_status', 'unpaid')
           ->whereIn('enrollment_status', ['back_out', 'declined']);
    })
    ->get(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...