2017-05-21 1 views
2

Laravel 응용 프로그램에 start_dateend_date 특성을 포함하는 구독 모델이 있습니다. 두 개의 쿼리 범위 인 scopeActive와 scopeFuture를 만들어 활성 및 향후 구독을 각각 찾습니다.OR 컨텍스트에서 여러 Laravel 범위 사용

활성 또는 향후 구독을 찾을 수 있도록 OR 문맥에서 두 범위를 모두 사용하여 쿼리를 작성하는 방법을 알고 싶습니다.

서브 스크립 션 모델

/** 
* Scope a query to only include active subscriptions. 
* 
* @param \Illuminate\Database\Eloquent\Builder $query 
* @return \Illuminate\Database\Eloquent\Builder 
*/ 
public function scopeActive($query) 
{ 
    return $query->where('start_date', '<', Carbon::now()) 
       ->where('end_date', '>', Carbon::now()); 
} 

/** 
* Scope a query to only include future subscriptions. 
* 
* @param \Illuminate\Database\Eloquent\Builder $query 
* @return \Illuminate\Database\Eloquent\Builder 
*/ 
public function scopeFuture($query) 
{ 
    return $query->where('start_date', '>', Carbon::now()); 
} 


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

비즈니스 모델

..... 
public function subscriptions() 
{ 
    return $this->hasMany('App\Subscription'); 
} 

사용자 모델

public function business() 
{ 
    return $this->hasOne('App\Business'); 
} 

컨트롤러

Subscription::active()->get(); 

답변

1

시도해보십시오.

$subscriptions = Subscription::where(function ($query) { 
    $query->active(); 
})->orWhere(function ($query) { 
    $query->future(); 
})->get(); 

편집 : 예 관계에서 구독을 쿼리 할 때이의 예를 제공 할 수 주석

$subscriptions = auth()->user() 
    ->business() 
    ->subscriptions() 
    ->where(function ($query) { 
     $query->active(); 
    })->orWhere(function ($query) { 
     $query->future(); 
    })->get(); 
+0

에 요청한? 예 : 'Auth :: user() -> business-> subscriptions() -> get(); ' – Imran

+1

@Imran이 대답에 예제를 추가했습니다. 또한 'business'가 아닌'business()'를 사용하십시오. 당신처럼 그것을 사용하면 비즈니스를 가져오고 그 다음에 구독을 얻습니다. 그러나'business()'를 사용하면 구독이 데이터베이스에서 가져옵니다. 나는이 질문을 다른 질문에도 올렸습니다. – Sandeesh

+0

감사합니다 Sandeesh하지만 업데이트 된 쿼리는'Call to Undefined Method Illuminate \ Database \ Query \ Builder :: subscriptions()'오류를 반환합니다. 관계는 비즈니스 모델에서 명확하게 정의됩니다. – Imran