ThinkPHP: 모델을 위한 가장 강력한 세 가지 도구 중 하나(검색자)

爱喝马黛茶的安东尼
풀어 주다: 2019-12-16 16:51:50
앞으로
3189명이 탐색했습니다.

ThinkPHP: 모델을 위한 가장 강력한 세 가지 도구 중 하나(검색자)

[√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(&#39;name&#39;,&#39;like&#39;, $value . &#39;%&#39;);
    }
    
    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime(&#39;create_time&#39;, $value[0], $value[1]);
    }    
}
로그인 후 복사

검색기 메소드에는 세 개의 매개변수가 있는데 첫 번째는 쿼리 개체이고 두 번째는 현재 검색 식별자의 값입니다. 세 번째는 모든 현재 검색 데이터입니다(선택 사항).

그러면 다음 쿼리를 사용할 수 있습니다.

User::withSearch([&#39;name&#39;, &#39;create_time&#39;], [
&#39;name&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1
    ])
->select();
로그인 후 복사

최종 생성된 SQL 문은

SELECT * FROM `think_user` WHERE  `name` LIKE &#39;think%&#39; AND `create_time` BETWEEN &#39;2018-08-01 00:00:00&#39; AND 
&#39;2018-08-05 00:00:00&#39;
로그인 후 복사

와 유사합니다. 쿼리 조건의 상태 필드에 데이터가 없음을 알 수 있으므로 잘못된 쿼리 조건을 피할 수 있습니다. 이 예에서는 name 및 create_time 조건만 쿼리에 사용할 수 있습니다.

실제로 검색기에서 쿼리 표현식을 사용하는 것 외에도 다른 쿼리 생성자와 체인 작업을 사용할 수도 있습니다.

예를 들어, 양식에 정의된 정렬 필드를 기준으로 검색 결과를 정렬해야 하는 경우

<?php
namespace app\index\model;
use think\Model;
class User extends Model 
{
    public function searchNameAttr($query, $value, $data)
    {
        $query->where(&#39;name&#39;,&#39;like&#39;, $value . &#39;%&#39;);
        if (isset($data[&#39;sort&#39;])) {
        $query->order($data[&#39;sort&#39;]);
        }        
    }
    
    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime(&#39;create_time&#39;, $value[0], $value[1]);
    }      
}
로그인 후 복사

를 사용할 수 있습니다. 그러면 다음 쿼리를 사용할 수 있습니다.

User::withSearch([&#39;name&#39;,&#39;create_time&#39;, &#39;status&#39;], [
&#39;name&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1,
        &#39;sort&#39;=>[&#39;status&#39;=>&#39;desc&#39;],
    ])
->select();
로그인 후 복사

최종 쿼리 SQL은

SELECT * FROM `think_user` WHERE  `name` LIKE &#39;think%&#39; AND `create_time` BETWEEN &#39;2018-08-01 00:00:00&#39; AND 
&#39;2018-08-05 00:00:00&#39; ORDER BY `status` DESC
로그인 후 복사

일 수 있습니다. 또한 검색기 필드 별칭을 정의합니다. 예:

User::withSearch([&#39;name&#39; => &#39;nickname&#39;,&#39;create_time&#39;, &#39;status&#39;], [
&#39;nickname&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1,
        &#39;sort&#39;=>[&#39;status&#39;=>&#39;desc&#39;],
    ])
->select();
로그인 후 복사

검색된 데이터는 별명 필드 식별자를 사용하지만 여전히 이름 필드(즉, searchNameAttr 메서드)로 식별되는 검색기를 사용합니다.

검색어는 일반적으로 검색어 범위와 비교됩니다. 검색어가 아무리 정의되어 있어도 검색어 범위를 쿼리와 결합해야 하는 경우 여러 번 호출해야 합니다.

Db 쿼리 방식을 사용하는 경우 검색기 기능을 계속 사용할 수 있지만 다음과 같이 검색기 메서드 정의를 클로저 메서드로 변경해야 합니다.

User::withSearch([&#39;name&#39; => function($query,$value,$data){
    $query->where(&#39;name&#39;,&#39;like&#39;, $value . &#39;%&#39;);
}, &#39;create_time&#39;=>function($query,$value,$data){
    $query->whereBetweenTime(&#39;create_time&#39;, $value[0], $value[1]);
}], [
&#39;name&#39;=>&#39;think&#39;,
    &#39;create_time&#39;=>[&#39;2018-8-1&#39;,&#39;2018-8-5&#39;],
        &#39;status&#39;=>1
    ])
->select();
로그인 후 복사

PHP 중국어 웹사이트에는 무료가 많이 있습니다 ThinkPHP 입문 튜토리얼, 환영합니다 모두가 배우세요!

이 기사는 https://blog.thinkphp.cn/783775

에서 복제되었습니다.

위 내용은 ThinkPHP: 모델을 위한 가장 강력한 세 가지 도구 중 하나(검색자)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:thinkphp.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!