2014-10-14 2 views
2

Eloquent/raw 쿼리가 쿼리가 실행되기 전에 함수를 실행하는 방법이 있습니까? 함수가 이전에 실행되어야하는 경우 매개 변수를 전달하는 기능을 확장 할 수 있으면 좋을 것입니다. 함수의 결과 (true/false)에 따라 쿼리가 실행되지 않아야합니다.Laravel - 쿼리가 실행되기 전에 함수 실행

"DB::listen"의 보안 주체를 사용하는 것이 좋겠지 만이 기능 내에서 쿼리를 중지하거나 실행할 수 있는지 확실하지 않습니다.

이 이유는웨어 하우스 (db)에 결과를 영구 저장하고 항상 거대한 데이터베이스를 쿼리하지 않기 위해 약간의 데이터웨어 하우스를 직접 구축하고 싶기 때문입니다.

내가 사용하고자하는 방법은 쿼리의 해시를 생성하고 해시가웨어 하우스에 있는지 확인하는 것입니다. 값이 있으면 값이 리턴됩니다. 그렇지 않으면 쿼리가 실행되고 해시와 함께 출력이웨어 하우스에 저장됩니다.

아이디어가 있으십니까?

///// EDIT ///// 계산 된 값을 업데이트해야하는 경우 쿼리에 액세스하고 값을 업데이트하고 싶습니다. 예 : 12 월의 자동차 수 : 12 월에있을 때마다 계속해서 가치를 업데이트해야합니다. 그래서 나는 실행 된 쿼리를 db에 저장하고 그것을 검색하고 실행 한 다음 값을 업데이트합니다.

//// 편집 2 ///// enter image description here

Github에서 : 내가 달성하고자하는 것은 Laravels 쿼리/웅변 논리에 끼어에서 데이터웨어 하우스 논리를 사용하는 것입니다 https://github.com/khwerhahn/datawarehouselibrary/blob/master/DataWareHouseLib.php

배경.

이 같은

아마 뭔가 :

$invalid_until = '2014-12-31 23:59:59'; // date until query needs to be updated every ten minutes 
$cars = Cars::where('sales_month', '=', 12)->dw($invalid_until)->get(); 

DW ($의 date_parameter는) 내가 Laravel 백그라운드에서 데이터웨어 하우스 로직을 실행하고 DB에있는 경우 다음 쿼리를 다시 실행하지 싶습니다 추가 된 경우 .

+0

을 그래서 기본적으로 당신이 캐싱 시스템을 원한다. 그건 이미 laravel에 있습니다. 다른 패키지 외에도 찾을 수 있습니다. –

+0

예 캐싱 시스템을 원하지만 10 분이 아닌 데이터베이스에서 결과를 쿼리 할 수있는 시스템 – Tino

+0

'rememberForever()'사용 캐시가 끝나지 않게하려면 왜 캐시 제한이 10 분이라고 생각하는지 모르겠다. –

답변

0

이벤트를 수행하기 위해 이벤트를 사용할 필요는 없습니다.

캐싱 쿼리

쉽게 방법을 기억 사용하여 쿼리의 결과를 캐시 할 수있다 : 4.2 문서에서이 예에서

$users = DB::table('users')->remember(10)->get(); 

을, 쿼리의 결과는 캐시됩니다 10 분 분. 결과가 캐싱되는 동안 쿼리는 데이터베이스에 대해 으로 실행되지 않으며 결과는 응용 프로그램에 지정된 기본 캐시 드라이버에서로드됩니다.

http://laravel.com/docs/4.2/queries#caching-queries

또한 설득력 개체에 대해 이것을 사용할 수 있습니다

,

예 : User::where($condition)->remember(60)->get()

+0

이 솔루션에는 시간 제한은 있지만, 영구적으로 데이터베이스에 보관하고 싶습니다. – Tino

+0

'-> rememberForever()'를 사용하고 대답은 –

0

나는 당신이하려는 것을 얻을 수 있지만, 나는 (그것을 볼 때 그럴 수도 그래도 계속 그래야만합니다.) 여전히은 (특정 제한 시간을 원하지 않는다면) rememberForever()을 사용할 수 있습니다.

그래서 Cars 테이블이 있다고 가정 해 봅시다.

$cars = Cars::where('sales_month', '=', 12)->rememberForever()->get(); 

캐시를 삭제하는 문제를 해결하려면 캐싱 방법에 키를 할당하고 해당 키를 검색 할 수 있습니다. 이제, 위의 쿼리가된다 : 캐시에서

$cars = Cars::where('sales_month', '=', 12)->rememberForever('cars')->get(); 

당신은 DB에서 동일한 결과를 얻는 것 그 쿼리를 처음 실행할 때마다, 모든 다른 사람.

이제 테이블을 업데이트 할 예정이며 캐시를 재설정하겠습니까?

// Update query 
Cache::forget('cars'); 

자동차 쿼리에 대한 당신의 다음 호출이 새로운 결과 집합을 발급하고, 캐시됩니다 그래서, 당신의 업데이트를 실행 한 후 cars 인덱스) (캐시를 잊어 버려. 궁금한 점이 있으시면 remember()rememberForever()은 자신의 섹션에있는 문서에서 볼 수있는 것과 동일한 Cache 클래스를 사용하는 QueryBuilder 클래스의 메소드입니다.

또는 사실, 당신은 또한 (당신에게 더 나은 제어 할 수 있습니다) 직접 캐시 클래스를 사용할 수 있습니다

if (null == $cars= Cache::get('cars')) { 
    $cars = Cars::where('sales_month', '=', 12)->get(); 
    Cache::forever('cars', $cars); 
} 
+0

xx입니다.하지만 조금 더 가고 싶습니다. 수정보기 – Tino

관련 문제