2013-12-13 2 views
0

글로벌 컨텍스트

나는 Laravel's query builder과 SQLite 데이터베이스를 사용하고 있습니다. 물론 datetime 유형은 SQLite와 함께 존재하지 않으며 strftime을 사용하여 타임 스탬프를 월 또는 연도 값으로 변환합니다. SQLite는과PHP 변수를 문자열로 강제 변환하는 방법?

미묘 난 그냥

다음 쿼리는 (SQLite는 관리자와 직접 테스트) 작동 발견 :

SELECT * FROM "articles" 
WHERE strftime("%Y", mydate, "unixepoch", "localtime") = "2013" 

이 하나가 작동하지 않습니다

SELECT * FROM "articles" 
WHERE strftime("%Y", mydate, "unixepoch", "localtime") = 2013 

로 비교가 문자열로 수행되어야한다는 것을 이해하는 한.

문제가

어떻게 Laravel의 쿼리 작성기로 해결할 수 있습니까?

DB의 특정 기능에 대해서는 DB::raw 도구를 사용해야한다는 내용을 읽었습니다.

$articles = DB::table('articles') 
->where(DB::raw('strftime("%Y", articles.date, "unixepoch", "localtime") '), $annee) 
->orderBy('date', 'DESC')->toSql(); 

하지만 문제는 매개 변수 $annee이며 쿼리를 작성할 때 숫자와 같이 해석됩니다.

PHP에는 캐스트가 없으므로 해석은 컨텍스트에 따라 다릅니다. 해석에 영향을 줄 수있는 방법이 있습니까?

+2

저는 Laravel에 익숙하지 않지만'$ annee '위치에'(string) $ annee'을 시도해 보셨습니까? (예, PHP에서는 캐스팅이 있지만'string','array','float','int'와'object' 만) –

+0

@PetervanderWal'(string) $ annee'는 괜찮습니다. PHP 매뉴얼을 읽었을 때 첫 줄을 잘못 이해한다고 생각합니다 :'PHP는 명시 적 타입 정의를 지원하지 않습니다. ' – Fractaliste

+0

이 줄은 Java, C# 및 특정 유형의 변수 ('string myVar')를 정의하는 다른 언어와 같이 변수 자체가 입력되지 않음을 의미합니다. PHP에서'$ myVar'는 첫 줄에 int가 될 수 있고 다음 줄에 문자열을 유지할 수 있습니다. 그러나 변수에 저장된 * value *는 특정 유형이므로이 유형을 변경할 수 있습니다 (PHP에서 'Type Juggling'이라고 함). –

답변

0

유형 캐스팅은 PHP에서 지원되지만 string, array, float, int 및 object에만 지원됩니다.

DB::table('articles') 
->where('myColumn', (string) $annee) 
->orderBy('date', 'DESC')->toSql(); 

하지만 간단하고 신속한 방법은 단순히 문자열을 추가하는 것입니다.

DB::table('articles') 
->where('myColumn', "" + $annee) 
->orderBy('date', 'DESC')->toSql(); 
관련 문제