如何获得具有两个或更多个特定条件的行?

时间:2019-02-20 05:59:01

标签: laravel laravel-5 eloquent

ApplicantTbl

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

EnrollmentRequestContentTbl

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

我的目标是使所有申请人都包括APP_ID 1 if

  1. payment_status上的enrollmentRequestContentTbl支付
  2. payment_status上的enrollmentRequestContentTbl未付款,而enrollment_statusback_outdeclined

其余可能的条件将被忽略,并且无法从我的查询中获取。

由于payment_statuspending,因此上表将忽略申请人1。

如果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 :(得分:1)

您实际上已经关闭。您只需要更改逻辑,这就是我所做的:

首先,使用pivot table获取whereDoesntHave中不存在的所有申请人。

下一步是仅在其状态为“已付款”(通过使用pivot table 或其orWhereHas 中存在的所有申请人状态为“未付款”,但其注册状态应为“退回”或“拒绝”(通过将orWhereHaswhereIn一起使用)。

$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(); 

答案 1 :(得分:0)

您可以尝试使用下面的代码来满足您的条件。

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;
}