[√New Skill] Searcher - 검색 코드 통합 관리
Model searcher는 모델 getter 및 modifier 기능에 이어 세 번째 통합 관리 도구로 주로 사용됩니다. 필드를 캡슐화하는 쿼리 조건식 (또는 검색 식별자) 검색자는 특수 메소드에 해당합니다(메소드는 공개 유형이어야 합니다). 메소드 명명 규칙은 searchFieldNameAttr입니다(FieldName은 데이터 테이블 필드의 카멜 케이스 변환입니다). withSearch 메소드.
검색기의 사용 시나리오는 다음과 같습니다.
·양식의 검색 조건을 제한하고 표준화합니다.
·미리 정의된 쿼리 조건은 쿼리를 단순화합니다.
예를 들어 User 모델의 이름 필드와 시간 필드에 대한 검색기를 정의해야 하는 경우 다음을 사용할 수 있습니다.
<?php namespace app\index\model; use think\Model; class User extends Model { public function searchNameAttr($query, $value, $data) { $query->where('name','like', $value . '%'); } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
검색기 메소드에는 세 개의 매개변수가 있는데 첫 번째는 쿼리 개체이고 두 번째는 현재 검색 식별자의 값입니다. 세 번째는 모든 현재 검색 데이터입니다(선택 사항).
그러면 다음 쿼리를 사용할 수 있습니다.
User::withSearch(['name', 'create_time'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->select();
최종 생성된 SQL 문은
SELECT * FROM `think_user` WHERE `name` LIKE 'think%' AND `create_time` BETWEEN '2018-08-01 00:00:00' AND '2018-08-05 00:00:00'
와 유사합니다. 쿼리 조건의 상태 필드에 데이터가 없음을 알 수 있으므로 잘못된 쿼리 조건을 피할 수 있습니다. 이 예에서는 name 및 create_time 조건만 쿼리에 사용할 수 있습니다.
실제로 검색기에서 쿼리 표현식을 사용하는 것 외에도 다른 쿼리 생성자와 체인 작업을 사용할 수도 있습니다.
예를 들어, 양식에 정의된 정렬 필드를 기준으로 검색 결과를 정렬해야 하는 경우
<?php namespace app\index\model; use think\Model; class User extends Model { public function searchNameAttr($query, $value, $data) { $query->where('name','like', $value . '%'); if (isset($data['sort'])) { $query->order($data['sort']); } } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
를 사용할 수 있습니다. 그러면 다음 쿼리를 사용할 수 있습니다.
User::withSearch(['name','create_time', 'status'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1, 'sort'=>['status'=>'desc'], ]) ->select();
최종 쿼리 SQL은
SELECT * FROM `think_user` WHERE `name` LIKE 'think%' AND `create_time` BETWEEN '2018-08-01 00:00:00' AND '2018-08-05 00:00:00' ORDER BY `status` DESC
일 수 있습니다. 또한 검색기 필드 별칭을 정의합니다. 예:
User::withSearch(['name' => 'nickname','create_time', 'status'], [ 'nickname'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1, 'sort'=>['status'=>'desc'], ]) ->select();
검색된 데이터는 별명 필드 식별자를 사용하지만 여전히 이름 필드(즉, searchNameAttr 메서드)로 식별되는 검색기를 사용합니다.
검색어는 일반적으로 검색어 범위와 비교됩니다. 검색어가 아무리 정의되어 있어도 검색어 범위를 쿼리와 결합해야 하는 경우 여러 번 호출해야 합니다.
Db 쿼리 방식을 사용하는 경우 검색기 기능을 계속 사용할 수 있지만 다음과 같이 검색기 메서드 정의를 클로저 메서드로 변경해야 합니다.
User::withSearch(['name' => function($query,$value,$data){ $query->where('name','like', $value . '%'); }, 'create_time'=>function($query,$value,$data){ $query->whereBetweenTime('create_time', $value[0], $value[1]); }], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->select();
PHP 중국어 웹사이트에는 무료가 많이 있습니다 ThinkPHP 입문 튜토리얼, 환영합니다 모두가 배우세요!
이 기사는 https://blog.thinkphp.cn/783775
에서 복제되었습니다.위 내용은 ThinkPHP: 모델을 위한 가장 강력한 세 가지 도구 중 하나(검색자)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!