Eloquent Collection : 계산 및 비우기 감지


272

이것은 사소한 질문 일지 모르지만 Laravel이 반환 된 Eloquent 컬렉션 $result = Model::where(...)->get()이 비어 있는지 확인하고 요소 수를 계산 하는 특정 방법을 권장하는지 궁금합니다 .

우리는 현재 !$result빈 결과를 감지하는 데 사용하고 있습니까? 에 대해서는 count($result)실제로 빈 결과를 포함하여 모든 사례를 다루고 있습니까?

답변:


581

사용하는 경우 ->get()를 단순히 아래 중 하나를 사용할 수 없습니다 :

if (empty($result)) { }
if (!$result) { }
if ($result) { }

결과가없는 경우에도 dd($result);인스턴스 Illuminate\Support\Collection가 항상 반환 된다는 것을 알 수 있습니다 . 본질적으로 확인하는 것은 $a = new stdClass; if ($a) { ... }항상 true를 반환합니다.

결과가 있는지 확인하려면 다음 중 하나를 수행하십시오.

if ($result->first()) { } 
if (!$result->isEmpty()) { }
if ($result->count()) { }
if (count($result)) { }

쿼리 빌더 ->first()대신 대신 사용 ->get()하여 처음 찾은 모델의 인스턴스를 리턴 할 수도 있습니다 null. 데이터베이스에서 하나의 결과 만 필요하거나 예상 할 때 유용합니다.

$result = Model::where(...)->first();
if ($result) { ... }

참고 / 참조

보너스 정보

메소드 이름이 종종 둘 사이에서 동일하기 때문에 Collection과 Query Builder의 차이점은 Laravel의 새로운 사용자에게는 약간 혼동 될 수 있습니다. 따라서 어떤 작업을하고 있는지 아는 것이 혼란 스러울 수 있습니다. 쿼리 빌더는 기본적으로 쿼리를 실행하고 데이터베이스에 도달 할 메소드를 호출 할 때까지 (예 : 특정 메소드 등을 호출 할 때) 쿼리를 빌드합니다 ->all() ->first() ->lists(). 이러한 메소드 Collection 오브젝트 에도 존재하며 결과가 여러 개인 경우 쿼리 빌더에서 리턴 될 수 있습니다. 실제로 어떤 클래스를 사용하고 있는지 확실하지 않은 경우 수행 var_dump(User::all())하고 실험하여 실제로 어떤 클래스가 반환되는지 확인하십시오.get_class(...)). Collection 클래스의 소스 코드를 확인하는 것이 좋습니다. 매우 간단합니다. 그런 다음 Query Builder를 확인하고 함수 이름의 유사성을보고 실제로 데이터베이스에 도달하는시기를 찾으십시오.


4
thx, 당신이 쿼리를 실행 first()하면 결과가 다르다는 것을 추가하기 위해 빈 결과로 get()확인할 수 있습니다!$resultnull
bitinn

2
@btinn yes-예를 들어- Model::first()실제로는 컬렉션이 아닌 쿼리 빌더의 '첫 번째'방법에 따라 작동하므로 데이터베이스에서 첫 번째 방법을 선택하지만 Model::get()Illuminate \ Support 인스턴스를 반환합니다. \ 컬렉션은 그래서 당신이 그랬다면 $r = Model::get()다음 $r->first()은 해당 모음 내에서 첫 번째 항목을 선택합니다.
Gary Green

이 답변에서 다루지 않는 한 가지는 count($result)작동 하는지 여부입니다 . 그 세부 사항을 추가하면 개선 될 것입니다.
Mark Amery

$ result-> count와 count ($ result)의 차이점 $ result-> count가 데이터베이스에 다시 충돌합니까? 그렇지 않다면, 이것들이 같다고 생각합니다!
Kamy D

2
@pathros 그렇게하는 간단한 방법은 없습니다. foreach루프를 사용 하여 컬렉션의 각 멤버를 반복 한 다음 이러한 검사 중 하나를 사용해야합니다 (생각 :) count($collection->column).
PapaHotelPapa

70

나는 당신이 찾고 있다고 생각합니다 :

$result->isEmpty()

와는 다르며 empty($result)결과는 빈 컬렉션이기 때문에 사실이 아닙니다. 당신의 제안 count($result)도 좋은 해결책입니다. 문서에서 참조를 찾을 수 없습니다


1
$ collection-> column과 같은 특정 열 (속성)이 비어 있는지 여부를 확인하려는 경우는 어떻습니까?
Pathros

13

위의 승인 된 답변에 동의합니다. 그러나 일반적으로 $results->isNotEmpty()아래 주어진 방법을 사용 합니다.

if($results->isNotEmpty())
{
//do something
}

if(!results->isEmpty())때때로 '!'를 추가하는 것을 잊었 기 때문에 보다 장황합니다 . 원하지 않는 오류가 발생할 수 있습니다.

이 방법은 버전 5.3 부터 존재합니다 .


4

Laravel에는 결과 수 / 비어 있음 / 비어 없음을 확인하기위한 몇 가지 방법이 있습니다.

$result->isNotEmpty(); // True if result is not empty.
$result->isEmpty(); // True if result is empty.
$result->count(); // Return count of records in result.

4

사용하는 것이 좋습니다

$result->isEmpty();

컬렉션이 비어 있으면 isEmpty 메소드는 true를 리턴합니다. 그렇지 않으면 false가 리턴됩니다.


3

나는 당신이 같은 것을 시도 생각

  @if(!$result->isEmpty())
         // $result is not empty
    @else
        // $result is empty
    @endif

또는 사용

if (!$result) { }
if ($result) { } 

2

넌 할 수있어

$result = Model::where(...)->count(); 

결과를 계산합니다.

당신은 또한 사용할 수 있습니다

if ($result->isEmpty()){}

결과가 비어 있는지 확인합니다.


1

Laravel Documentation 에 따르면 다음과 같이 사용할 수 있습니다.

$result->isEmpty();

isEmpty방법은 반환 true컬렉션이 비어있는 경우; 그렇지 않으면 false반환됩니다.


0

Laravel은 실제로 Model::all(); 컬렉션을 원하지 않을 때 컬렉션을 반환 하므로 집합을 입력 할 수 있습니다. (array)Model::all();그런 다음 array_filter를 사용하여 결과를 반환 할 수 있습니다

$models = (array)Model::all()
$models = array_filter($models);
if(empty($models))
{
 do something
}

이렇게하면 다음과 같은 작업을 수행 할 수 있습니다 count().


3
컬렉션으로 유지하는 것이 실제로 편리하므로 반환 된 객체가 여전히 컬렉션 외관에서 유용한 기능을 많이 상속받을 수 있습니다.
Gokigooooks

0

------ 해결 ------

이 경우 두 개의 cace에 대한 두 가지 유형의 카운트를 확인하려고합니다.

사례 1 :

결과에 단 하나의 레코드 만 포함 된 경우 다른 단어-> first ()를 사용하여 데이터베이스에서 단일 행을 선택하십시오.

 if(count($result)){
     
       ...record is exist true...
  }

사례 2 :

-> get () 또는-> all ()을 사용하여 결과에 여러 행의 다른 세트가 포함 된 경우

  if($result->count()) {
    
         ...record is exist true...
  }

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