2014-07-07 2 views
1

필자는 문서화 된 mySQL 문제인 것으로 알고 있습니다. 그러나 orderBy 쿼리에서 행의 순위를 얻는 Eloquent 솔루션을 찾지 못했습니다. 여기 내가 원하는 걸.OrderBy 행 순위 얻기 Eloquent query

Number::orderBy('number', 'desc')->get(); 

는 그러나, 나는 각 행의 순위를 검색하려는 :

나는 내가 번호 열이 쿼리를 주문할 수 있어요이

id | number 
----------- 
1 | 30 
2 | 24 
3 | 4 
4 | 45 

처럼 보이는 테이블이 있습니다. 따라서 ID가 4 인 행 (숫자 45)은 1의 순위를 갖습니다. ID가 1 인 행 (및 30)의 순위는 2입니다.

Eloquent 쿼리를 사용하여 행의 순위를 얻는 가장 좋은 방법은 무엇입니까?

+0

http://stackoverflow.com/questions/16343482/getting-the-current-rows-rank-with-laravel – Mihai

답변

0

글쎄, 정말 간단합니다. 현재 갖고있는 것은 효과가 있습니다.

// any Model, model trait or whatever you like 
// for convenience wrapped in scope 
public function scopeGetWithRowNumber($query, $columns = ['*']) 
{ 
    // Set the row number 
    $offset = (int) $query->getQuery()->offset; 
    DB::statement(DB::raw("set @row={$offset}")); 

    // Adjust SELECT clause to contain the row 
    if (! count($query->getQuery()->columns)) $query->select($columns); 
    $sub = $query->addSelect([DB::raw('@row:[email protected]+1 as row')]); 

    // Return the result instead of builder object 
    return $query->get(); 
} 

그럼 당신은 어떤 쿼리를 실행할 것입니다 그러나 사용 : 당신이 (당신이 좋아하는 경우 순위 행의 이름을 변경)이 신뢰할 수있는 모델 당 쿼리 대신 여러 레코드를 얻기 위해 MySQL의에서

$i = 1; 
$numbers = Number::orderBy('number', 'desc')->get(); 

foreach($numbers as $number) 
{ 
    echo $i . ' ' . $number->id; 
    $i++; 
} 
+0

내가 실제로 이런 짓을)하지만, T.Otwells 웅변의 위대함을 최대한 발휘 페이지 매김을 구현하면, 그 번호는 다음 페이지에서 시작합니다. – codeforfood

+1

그런 다음 $ i를 1이 아닌 오프셋 ('getFrom()'매김 방법)으로 초기화하십시오. – Milosz

0

:

Number::getWithRowNumber(); // SELECT * + row attribute starting from 1 

Number::take(25)->skip(2500)->getWithRowNumber(); // SELECT * + row 2501+ 

Number::latest()->getWithRowNumber(['id','number']); // SELECT id, number + row 1+ 

Number::orderBy('number','desc')->getWithRowNumber(); // example from your question 
2

laravel 's Eloquent의 경우 ... 모델에 추가하십시오. 때

public function getPostionAttribute() 
{ 
    return $this->newQuery()->where('number', '>=', $this->number)->count(); 
}