2016-06-14 1 views
0

나는이 구조를 이해하지 않습니다

$posts = Post::where(function($query) 
     { 
      $query->where('title', 'LIKE', "%search%") 
        ->orWhere('body', 'LIKE', "%search%"); 
     }); 

합니까 자체 기능 패스 $ 쿼리? 또는 $ query는 코드의 다른 부분에서 인스턴스화 된 객체를 나타 냅니까?

답변

1

당신이 Laravel 소스에 깊은 가고 싶어하면, 당신이 볼 수, 당신은 where의 첫 번째 인수에 폐쇄를 통과 할 때, 그것은 새로운 중첩 된 쿼리로 처리됩니다 :

if ($column instanceof Closure) { 
    return $this->whereNested($column, $boolean); 
} 

그리고 다음, 그냥 첫 번째 매개 변수 (query)

$query = $this->newQuery(); 

$query->from($this->from); 

call_user_func($callback, $query); 

길고도 짧은 이야기로 첨부 Query Builder의 새로운 인스턴스 call_user_func를 사용하여 함수를 호출하여 $ 쿼리 매개 변수는 Query Builder의 새로운 인스턴스입니다.

0

PHP에서 클로저는 "매개 변수를 수동으로 바인딩 한 호출 가능 클래스"입니다 (http://php.net/manual/en/class.closure.php#117427에서 인용).

Laravel은 지속성을 필요로하지 않고 클래스를 인스턴스화하고 사용하고 폐기 할 수 있기 때문에 Closure 기반 클래스와 호출을 광범위하게 사용합니다.

더 사용이 (클로저에 변수 "범위에서"통과) 고려 : 쿼리 컨텍스트는 매우 복잡한 구성하는 데 사용하지만, 지향 쿼리 개체 수에

// This var would not get passed to the closure as it's "out of scope" 
    $outOfScopeVar = [12,13,14]; 

    $posts = Post::where(function($query) use($outOfScopeVar) 
    { 
     $query->where('title', 'LIKE', "%search%") 
       ->orWhere('body', 'LIKE', "%search%") 
       ->whereIn('id', function ($query2) use ($outOfScopeVar) { 
        $query2->select('users_posts.posts_id') 
        ->from('users_posts') 
        ->whereIn('users_posts.users_id',$outOfScopeVar) 
        ->get(); 
       }); 
    }); 

.

쿼리 이외의 다른 큐와 Mail 구조와 같은 클로저 기반 기능은 클로저를 사용하여 관련된 전체 메서드를 나열하지 않고도 기능과 범위를 정의합니다. 예를 들어, 메시지를 생성하고, 파일을 첨부하고, 헤더를 추가하고, 뷰를 렌더링하는 등의 작업은 모두 전달 된 클로저와 상호 작용하는 백그라운드 메소드에 의해 처리됩니다.

메일러 클래스가 전달 된 클로저와 상호 작용하는 방식은 문서를 탐색하여 확인할 수 있습니다. QueryBuilder에 관해서는

https://github.com/laravel/framework/blob/master/src/Illuminate/Mail/Mailer.php#L149

:

https://github.com/laravel/framework/blob/43808e3b54973e9c18de01b7390f7d137fa38762/src/Illuminate/Database/Query/Builder.php

관련 문제