ThinkPHP 5.1이 정식 출시된 지 꽤 됐는데, 새로운 기능을 차례로 소개하겠습니다. 오늘 소개해드리고 싶은 기능은 아직 많은 사용자들이 이해하지 못하는 기능인 JSON 필드 데이터 지원입니다.
하지만 우선 이 글에서 설명한 JSON 필드 데이터에 대한 지원은 V5.1.4+ 버전부터 도입되었다는 점을 참고하세요. 보안 업데이트가 포함되어 있으므로 버전 5.1.9+를 사용하는 것이 좋습니다.
본 문서의 JSON 필드 정의에는 저장된 데이터가 JSON 형식인 JSON 유형 또는 문자 유형이 포함됩니다. 따라서 이론적으로 JSON 필드 조건부 쿼리를 사용하는 것 외에는 데이터베이스 유형 및 버전에 대한 요구 사항이 없습니다.
Db 클래스는 JSON을 운영합니다
모델 클래스를 사용하지 않는 경우 Db 클래스는 데이터 테이블의 JSON 형식 필드를 지정하는 json 메서드를 제공합니다. 예를 들어 사용자 테이블에는 JSON 유형의 정보 필드가 있습니다. 다음 방법을 사용하여 데이터를 조작할 수 있습니다.
데이터 쓰기
$user['name'] = 'thinkphp'; $user['info'] = [ 'email' => 'thinkphp@qq.com', 'nickname' => '流年', ]; Db::name('user') ->json(['info']) ->insert($user);
json 메소드의 매개변수는 배열입니다. info 필드는 실제로 여러 JSON 유형 필드를 지정할 수 있습니다.
데이터 쿼리
전체 JSON 데이터 사용량을 쿼리합니다.
$user = Db::name('user') ->json(['info']) ->find(1); dump($user);
반환된 쿼리 결과 데이터에는 배열 유형의 정보 데이터가 자동으로 포함됩니다. 이는 JSON 형식의 데이터가 json_decode에 의해 자동으로 처리되었음을 의미합니다.
이 쿼리 방법은 정보 필드에 JSON 유형의 사용을 엄격히 요구하지 않습니다.
JSON 데이터 값을 기반으로 쿼리해야 하는 경우 다음 방법을 사용할 수 있습니다
$user = Db::name('user') ->json(['info']) ->where('info->nickname','ThinkPHP') ->find(); dump($user);
정보 필드는 다음과 같아야 합니다. JSON 유형이어야 하며 MySQL에는 버전 5.7 이상이 필요합니다.
를 지원하려면 물론 다중 레벨도 지원할 수 있습니다.
$user = Db::name('user') ->json(['info']) ->where('info->profile->nickname','ThinkPHP') ->find(); dump($user);
JSON 필드의 속성 유형은 자동으로 가져오지 않으므로 정수 데이터 쿼리인 경우, 수동 매개변수 바인딩이 필요합니다. 예:
$user = Db::name('user') ->json(['info']) ->where('info->user_id', ':user_id') ->bind(['user_id' => [10, \PDO::PARAM_INT]]) ->find(); dump($user);
data Update
Complete JSON data update
$data['info'] = [ 'email' => 'kancloud@qq.com', 'nickname' => 'kancloud', ]; Db::name('user') ->json(['info']) ->where('id',1) ->update($data);
이 쿼리 방법에서는 정보 필드에 JSON 유형을 사용할 필요가 없습니다
업데이트만 하면 JSON 데이터에 특정 값을 추가하려면 다음 방법을 사용할 수 있습니다.
$data['info->nickname'] = 'ThinkPHP'; Db::name('user') ->json(['info']) ->where('id',1) ->update($data);
마찬가지로 정보 필드는 JSON 유형이어야 합니다
모델 작업 JSON 데이터
모델을 사용하여 작업하는 경우 데이터베이스를 사용하면 JSON 데이터 작업이 더 간단해집니다.
사용자 모델 클래스에 json 속성 정의만 추가하면 됩니다.
<?php namespace app\index\model; use think\Model; class User extends Model { // 设置json类型字段 protected $json = ['info']; }
json 속성은 여러 필드 이름 정의도 지원합니다. 정의 후 다음 JSON 데이터 작업을 수행할 수 있습니다.
데이터 쓰기
배열 메서드를 사용하여 JSON 데이터 쓰기:
$user = new User; $user->name = 'thinkphp'; $user->info = [ 'email' => 'thinkphp@qq.com', 'nickname '=> '流年', ]; $user->save();
객체 메서드를 사용하여 JSON 데이터 쓰기
$user = new User; $user->name = 'thinkphp'; $info = new StdClass(); $info->email = 'thinkphp@qq.com'; $info->nickname = '流年'; $user->info = $info; $user->save();
Query data
Db 클래스 쿼리의 결과 유형이 다릅니다. 모델 자동으로 객체 모드로 변환됩니다.
$user = User::get(1); echo $user->name; // thinkphp echo $user->info->email; // thinkphp@qq.com echo $user->info->nickname; // 流年
는 JSON 필드 데이터 쿼리도 지원할 수 있습니다.
$user = User::where('info->nickname','流年')->find(); echo $user->name; // thinkphp echo $user->info->email; // thinkphp@qq.com echo $user->info->nickname; // 流年
Db 쿼리와 동일합니다. 쿼리해야 하는 JSON 속성이 정수 유형인 경우 수동 매개변수 바인딩이 필요합니다.
$user = User::where('info->user_id',':user_id') ->bind(['user_id' => [10 ,\PDO::PARAM_INT]]) ->find(); echo $user->name; // thinkphp echo $user->info->email; // thinkphp@qq.com echo $user->info->nickname; // 流年
V5.1.11+ 버전을 사용하는 경우 모델 클래스에서 JSON 필드의 속성 유형을 정의할 수 있으며, 해당 유형의 매개변수 바인딩 쿼리가 자동으로 수행됩니다.
<?php namespace app\index\model; use think\Model; class User extends Model { // 设置json类型字段 protected $json = ['info']; // 设置JSON字段的类型 protected $jsonType = [ 'user_id'=>'int' ]; }
정의된 유형이 없는 속성은 기본적으로 문자열 유형이므로 문자열 유형 속성을 정의할 필요가 없습니다.
데이터 업데이트
JSON 데이터 업데이트에도 객체가 사용됩니다
$user = User::get(1); $user->name = 'kancloud'; $user->info->email = 'kancloud@qq.com'; $user->info->nickname = 'kancloud'; $user->save();
JSON 유형 필드에 대해 더 복잡한 작업을 수행해야 하는 경우 exp 표현식을 통해 수행할 수도 있습니다. 이는 모든 사람이 더 많은 JSON 사용법을 발견하기를 기다리고 있습니다.
PHP 중국어 웹사이트에는 무료 ThinkPHP 입문 튜토리얼이 많이 있습니다. 누구나 배울 수 있습니다!
이 기사는 https://blog.thinkphp.cn/784281
에서 복제되었습니다.위 내용은 ThinkPHP: JSON 필드 유형(ORM) 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!