2017-12-07 3 views
2

지난 7 일 동안 등록 된 사용자를 검색해야했습니다. 나중에 나는 또한 30 일 365 일 동안 점검해야한다는 것을 깨달았다.Laravel에서 사용자 지정 쿼리 메서드를 등록하는 방법 (및 위치)

public function scopeCreatedWithinDays($query,$day){ 
    $str = $day.' days ago'; 
    $carbon = new Carbon($str); 
    $query->where('created_at', '>=', $carbon); 
} 

을 그리고 갑자기이 방법은 모든 모델에 걸쳐 반복 사용에 대한 좋은 후보임을 깨달았다 그래서 난 내 User.php에 쿼리 범위를 썼다. 그래서 나는 간단하게 $anyModel->createdWithinDays(30)을 호출하여 마지막으로 x 일 내에 생성 된 행을 쉽게 얻을 수 있도록이 메소드를 공통 위치에 정의해야합니다. 하지만

재사용 가능한 코드에 대한
+0

특성은 훌륭한 후보, 기본 클래스, 웅변적인 빌더의 매크로 일 수 있습니다. 몇 가지 옵션이 있습니다. – lagbox

답변

2

에서 연장 쿼리 빌더 :

\Illuminate\Database\Query\Builder::macro('createdWithinDays', function ($day) { 
    return $this->where('created_at', '>=', new \Carbon\Carbon($day .' days ago')); 
}); 

이제 당신은 모든 설득력 쿼리를 포함하는 쿼리 작성기를, 관련된 모든 쿼리에 해당하는 그 방법이 있어야합니다.

상속, 특성 없음, 모델 변경 없음 및 DB::에서도이 방법을 사용할 수 있습니다.

AnyModel::createdWithinDays(4)->get(); 
DB::table('blah')->createdWithinDays(4)->get(); 

죄송합니다 있습니다 .. '어디'부분 : 서비스 제공자 boot 방법에 매크로를 추가합니다.

+0

'AppServiceProvider'의'boot' 메소드에서 의미합니까? – Eisenheim

+1

모든 서비스 제공 업체가 할 것이지만, 분명히 그걸 던질 수 있습니다 :) – lagbox

2

당신이이 옵션을 사용할 수 있습니다 ... 넣어하는 방법과 위치를 모르는 :

  1. 는 기본 모델을 생성하고 다른 모든 모델은이 모델이해야한다 (이 기본 모델에서 확장 할 수 있도록 Eloquent 모델에서 확장)
  2. 특성을 만들고 실제로 필요한 모든 모델에서이 특성을 사용하십시오.

큰 차이는 없지만 여러 재사용 가능한 메소드가있는 하나의 큰 클래스를 만드는 대신 비슷한 기능 세트로 여러 특성을 만드는 것이 좋습니다. 당신이 특성의 방법을 넣고 기본 모델에서이 특성을 사용하여 모든 모델을 할 수 있도록 당신은 또한이를 혼합 할 수 물론

은에 방법을 macroing 수있는 옵션도 있습니다이 기본 모델

관련 문제