테이블에서 마지막 행을 선택하십시오.


163

테이블에 삽입 된 마지막 파일을 검색하고 싶습니다. 메서드 first()가 존재하고 테이블의 첫 번째 파일을 제공하지만 마지막 삽입을 얻는 방법을 모르겠습니다.


또한 참조 stackoverflow.com/questions/33321447/...을 어떻게 기존의 관계 (hasMany의) 정렬
타렉 아담

이것은 라 라벨에 대해 묻고 대답하는 사람을위한 것입니다. 당신이 말하는 라 라벨 버전을 지정하는 것이 중요합니다. 일반적으로 버전 4와 5에는 차이점과 이전 버전도 있습니다.
Heroselohim

답변:


224

지금 주문할 때와 같은 필드를 기준으로 내림차순으로 주문해야합니다. 예를 들어, 업로드가 완료되었을 때 타임 스탬프가있는 경우 이와 같은 작업을 수행 upload_time합니다.

프리 라벨 4

return DB::table('files')->order_by('upload_time', 'desc')->first();

라 라벨 4 이상

return DB::table('files')->orderBy('upload_time', 'desc')->first();

라 라벨 5.7 이상

return DB::table('files')->latest('upload_time')->first();

업로드 시간, 내림차순으로 파일 테이블의 행을 정렬 하고 첫 번째 행을 사용합니다 . 이것이 가장 최근에 업로드 된 파일입니다.


15
Laravel 4를 위해 이것은해야 orderBy하지order_by
자레드 Eitnier

9
ORM을 사용할 때 올바른 방법입니다.User::orderby('created_at', 'desc')->first();
Cas Bloem

1
라 라벨 5.x =orderBy('created_at', 'desc')
0x1ad2

9
created_at 열을 사용하는 이유는 무엇입니까? 기본 키 ID를 사용하는 것이 훨씬 빠릅니다. Laravel 5.x Files::orderBy(id', 'desc')->first();날짜순은 날짜가 문자열이고 색인이 생성되지 않기 때문에 더 오래 작동합니다. 기본 키는 인덱싱되어 매우 빠르게 작동합니다. created_at가 색인화 되더라도 기본 문자열의 경우 INT가 아닌 색인화 된 문자열입니다. 색인 문자열의 성능이 떨어집니다.
KorbenDallas

4
@KorbenDallas 의견은 때로는 orderBy('created_at', 'desc')마지막 행을 제공하지 않기 때문에 대답이되어야합니다 . 예 : 3 개의 행은 정확히 동일한 TIMESTAMP 값을 가질 수 있으며 3과 함께 orderBy('created_at', 'desc')3 개 중 첫 번째 (필수는 마지막
행일

111

Laravel에서 제공하는 최신 범위를 즉시 사용하십시오.

Model::latest()->first();

그렇게하면 모든 레코드를 검색하지 않습니다. orderBy에 대한 더 좋은 지름길.


7
이 방법 은 모델에서 자동 생성 created_at($timestamps = true)을 사용하지만 원하는 경우 비활성화 할 수 있으므로 정의되지 않은 경우 오류가 발생합니다.
Plotisateur

Laravel 5.7을 사용하고 있으며 모델 에서이 작업을 시도하면 여전히 모든 레코드를 검색합니다.
CJ Dennis

1
동일한 초 내에 여러 개의 레코드가 추가 된 경우 created_at 시간이이 레코드에 대해 동일하므로 latest ()에 의해 리턴 된 레코드가 예상 한 레코드가 아닐 수 있습니다.
F3CP

'created_at'열이 필요하지 않습니다. 최신 열을 지정할 수 있습니다. 예를 들면 다음과 같습니다. Model :: latest ( 'dateColumn')-> first ();
Tom

1 초 내에 2 개의 행이 삽입되면 실제 마지막 행을 얻지 못할 수 있습니다 (실제로는 단위 테스트에 문제가 발생 함).
chili

75

Laravel의 기본 ORM 인 Eloquent를 사용하는지 여부는 언급하지 않았습니다. 당신이 만든 경우에, created_at에 의해 User 테이블의 최신 엔트리를 얻고 싶다면, 아마도 다음과 같이 할 수 있습니다 :

User::orderBy('created_at', 'desc')->first();

먼저 created_at 필드를 기준으로 사용자를 내림차순으로 정렬 한 다음 결과의 첫 번째 레코드를 사용합니다.

그러면 컬렉션이 아닌 User 개체의 인스턴스가 반환됩니다. 물론이 대안을 사용하려면 Eloquent 클래스를 확장하는 User 모델이 있어야합니다. 다소 혼란 스러울 수 있지만 시작하기가 매우 쉽고 ORM이 실제로 도움이 될 수 있습니다.

자세한 내용 은 매우 풍부하고 자세한 공식 문서 를 확인하십시오 .


42

마지막 레코드 세부 사항을 얻으려면

  1. Model::all()->last(); 또는
  2. Model::orderBy('id', 'desc')->first();

마지막 레코드 ID를 얻으려면

  1. Model::all()->last()->id; 또는
  2. Model::orderBy('id', 'desc')->first()->id;

14

라 라벨 컬렉션에는 마지막 방법이 있습니다

Model::all() -> last(); // last element 
Model::all() -> last() -> pluck('name'); // extract value from name field. 

이것이 가장 좋은 방법입니다.


16
all()메소드가 실제로 모든 항목을로드 한다는 것을 지적하고 싶었습니다 . 수백만 개의 레코드가있는 테이블에서는 작동하지 않습니다.
Steven Jeffries

1
스티븐 제프리의 의견뿐만 아니라, 나는 호출 지적하고 싶습니다 last()반환에게 하나의 웅변 인스턴스가 아닌 컬렉션, 그리고 호출 pluck()이에하는 전화와 동일 Model::all()->pluck('name')하므로 반환 name의 속성 모든 테이블의 행
ivcandela을

5
이 방법은 실제로 더 나쁩니다. DB 수준으로 수행하는 대신 PHP 실행을 사용하여 마지막 원시를 가져옵니다. 테이블에 수백만 개의 원시가 있으면 얼마나 비효율적인지 알 수 있습니까?
Bhaskar Dabhi

이것이 가장 좋은 방법입니다. - 아니! 본 적이 없어요 필요한 행 대신 모든 행을 로드 할 것 입니다.
René Roth

11

이 시도 :

Model::latest()->get();

1
여러 행을 반환합니다. 그는 한 줄이 필요합니다. first ()는 orderBy () 절을 도와줍니다.
Tahir Afridi

1 초 내에 2 개의 행이 삽입되면 실제 마지막 행을 얻지 못할 수 있습니다 (실제로는 단위 테스트에 문제가 발생 함).
chili

1
큰 테이블에서는 @TahirAfridi가 언급했듯이 모든 행을 메모리에로드하기 때문에 메모리 부족 예외가 발생합니다.
Rihards

6

필터링하려는 필드와 함께 Laravel에서 제공하는 최신 범위를 사용할 수 있습니다. ID별로 주문한다고 가정 해 보겠습니다.

Model::latest('id')->first();

따라서 이런 방식으로 created_atLaravel에서 기본적 으로 필드별로 주문을 피할 수 있습니다 .


5

마지막 레코드 세부 사항을 얻으려면 아래 코드를 사용하십시오.

Model::where('field', 'value')->get()->last()

사용하지 마십시오. 이것은 가장 최근에 삽입 된 마지막 행에 직접 액세스 할 수있는 범위가있는 매우 나쁜 습관입니다.
일 돼지

3

Laravel 6.x에서 또 다른 멋진 방법입니다 (확실하지는 않지만 5.x에서도 작동해야 함).

DB::table('your_table')->get()->last();

당신도 필드에 액세스 할 수 있습니다 :

DB::table('your_table')->get()->last()->id;


또한 Laravel 5.8에서 나를 위해 작동, 바로 당신보기 전에 대답을 게시
눈이 부시도록 멋지게

1
laravel이 어떻게 이것을 배후에서 수행하는지와 이것이 큰 데이터 세트에 위험한 이유에 대한 약간의 설명, get()메소드는 모든 것을 가져오고 your_tableCollection을 생성하며 last()메소드는 해당 콜렉션에서 마지막 항목을 가져옵니다. 따라서 테이블의 모든 데이터가 이미 메모리에로드되어 있습니다 (나쁜). 씬 뒤에`DB :: table ( 'items')-> latest ()-> first ();`를 사용하여`orderBy ($ column, 'desc')`를 수행하고 첫 번째 레코드를 가져와야합니다.
Anuj Shrestha


1

당신은 당신이 수행 할 때 그냥 Laravel 3, 4 삽입하는 실제 행을 찾는 경우 save또는 create같은 새로운 모델에 대한 조치를 :

$user->save();

-또는-

$user = User::create(array('email' => 'example@gmail.com'));

삽입 된 모델 인스턴스가 리턴되고 방금 작성된 사용자의 프로파일 페이지로 경로 재 지정과 같은 추가 조치에 사용될 수 있습니다.

저용량 시스템에서 마지막으로 삽입 된 레코드 작업을 찾는 것은 거의 항상 작동하지만 동시에 삽입해야하는 경우 잘못된 레코드를 찾기 위해 쿼리를 끝낼 수 있습니다. 이는 여러 테이블을 업데이트해야하는 트랜잭션 시스템에서 실제로 문제가 될 수 있습니다.


1

어떻게 든 위의 모든 것이 laravel 5.3에서 작동하지 않는 것 같습니다. 그래서 다음을 사용하여 내 자신의 문제를 해결했습니다.

Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();

누군가를 구제 할 수 있기를 바랍니다.


1

사용 Model::where('user_id', $user_id)->latest()->get()->first(); 하면 하나의 레코드 만 반환하고 찾을 수 없으면를 반환 null합니다. 이것이 도움이되기를 바랍니다.


0

테이블에 날짜 필드가 있으면 this ( User::orderBy('created_at', 'desc')->first();)가 가장 좋은 해결책이라고 생각합니다. 그러나 날짜 필드가 없으며 Model ::orderBy('id', 'desc')->first()->id;최상의 해결책입니다.


0

점에 유의 last(), latest()당신이 순차적 또는 이벤트 / 주문 기록을 찾고 있다면 결정되지 않습니다. 마지막 / 최근 레코드는 정확히 동일한 created_at타임 스탬프를 가질 수 있으며 다시 얻는 레코드는 결정적이지 않습니다. 그렇습니다 orderBy(id|foo)->first(). 결정 론적 인 방법에 대한 다른 아이디어 / 제안은 환영합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.