2014-04-08 3 views
0

저는 Laravel Eloquent로이 쿼리를 작성하는 방법을 알아 내려고 노력하고 있습니다.Laravel Eloquent의 고급 쿼리

검색어 :

DB::select('SELECT 
    n.id, 
    n.parent_id, 
    n.name, 
    n.file, 
    n.created_at AS ts, 
    f.mime, 
    f.extension, 
    IF(ch.id, 1, 0) AS dirs 
FROM nodes AS n 
LEFT JOIN nodes AS ch ON ch.parent_id=n.id 
LEFT JOIN files AS f 
    ON n.file = f.id 
WHERE n.parent_id=? 
GROUP BY n.id',array($path)); 

나는 나의 모델 테이블 nodes을 사용 Node을 가지고 내가 가입해야 다른 모듈 return $this->belongsTo('NodeFile'); 포함, 내 Node 모델하는 방법 nodefile() 있습니다. NodeFile 모듈은 files 테이블을 사용하고이 두 테이블은 nodes.filefiles.id에 바인딩됩니다.

Node::with(
    array('nodefile'=>function($query){ 
     $query->select('mime','extension'); 
    }) 
)->where('name','LIKE','%'.$q.'%')->get(array(
    'id', 'parent_id', 'name', 'file', 'created_at AS nts' 
)); 

하지만 난 여전히 내 쿼리에서 IF(ch.id,1,0) AS dirs 필요합니다

이것은 내가 지금까지 무엇을 가지고 있습니다. 자기조차도하지 않았습니다.

누구나 가능한 가장 좋은 방법으로 어떻게 할 생각인가?

+2

왜 원시 쿼리()에 보관할 수 없습니까? ORM은 물건을 단순화하기 위해 발명 된 것이지 테이블을 머리에 대고 쾅 사게하지는 않습니다. ORMified가 될 수있는 것 - 좋습니다, Eloquent를 통해 확인하십시오. 그러나 일부 쿼리는 ORMS로 실행되지 않습니다. 그럼, 고문하지 말자. –

+1

'$ query-> select (DB :: raw (...)) '를 할 수있다. –

+1

당신은 관계에 대한 충분한 정보를 제공하지 않았고'IF (ch .id, 1, 0) as dirs', 그래서 도울 수는 없지만 [이 기사] (http://heera.it/laravel-model-relationship#.U0QUFvmSySo) Eloquent' 관계 기술. –

답변

0

다음 코드를 사용하여 수정했습니다. 날이 솔루션에 도착 도움이 원시 만드는 아이디어에 대한 @MarkBarker에

Node:: 
    leftjoin('files','files.id','=','nodes.file') 
->leftjoin('nodes AS ch','ch.parent_id','=','nodes.id') 
->where('nodes.id','=',$path) 
->groupBy('id') 
->get(array(
    'nodes.id', 
    'nodes.parent_id', 
    'nodes.name', 
    'nodes.file', 
    'nodes.created_at AS nts', 
    'files.mime', 
    'files.extension', 
    'ch.id AS dirs' 
)); 

감사합니다.