ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP: JSON フィールド タイプ (ORM) の使用法

ThinkPHP: JSON フィールド タイプ (ORM) の使用法

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼転載
2019-12-16 15:52:483784ブラウズ

ThinkPHP: JSON フィールド タイプ (ORM) の使用法

ThinkPHP 5.1 が正式にリリースされてしばらく経ちましたが、その新機能を順次紹介していきます。今日紹介したいのは、多くのユーザーがまだ理解していない機能である JSON フィールド データのサポートです。

ただし、まず最初に、この記事で説明する JSON フィールド データのサポートはバージョン V5.1.4 から導入されたものであることに注意してください。セキュリティ更新プログラムが含まれているため、必ずバージョン 5.1.9 を使用することをお勧めします。

この記事の JSON フィールドの定義には、保存されたデータが JSON 形式である場合の JSON タイプまたは文字タイプが含まれているため、理論上は、JSON フィールドの条件付きクエリを使用する場合を除き、データベースのタイプとバージョンに関する要件はありません。

Db クラスは JSON を操作します

モデル クラスを使用しない場合、Db クラスは、JSON を指定するための 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);

# #データ更新

完全な JSON データ更新

$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 属性定義を User モデル クラスに追加するだけです。

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
// 设置json类型字段
protected $json = [&#39;info&#39;];
}

json 属性では、複数のフィールド名の定義もサポートされており、定義後は次の JSON データ操作を実行できます。

データの書き込み

配列メソッドを使用して JSON データを書き込みます:

$user = new User;
$user->name = &#39;thinkphp&#39;;
$user->info = [
&#39;email&#39;    => &#39;thinkphp@qq.com&#39;,
    &#39;nickname &#39;=> &#39;流年&#39;,
];
$user->save();

オブジェクト メソッドを使用して JSON データを書き込みます

$user = new User;
$user->name = &#39;thinkphp&#39;;
$info = new StdClass();
$info->email = &#39;thinkphp@qq.com&#39;;
$info->nickname = &#39;流年&#39;;
$user->info = $info;
$user->save();

クエリ データ

結果の型は Db クラスのクエリとは異なり、モデルの JSON フィールドは自動的にオブジェクトに変換されます。

$user = User::get(1);
echo $user->name; // thinkphp
echo $user->info->email; // thinkphp@qq.com
echo $user->info->nickname; // 流年

JSON フィールド データのクエリもサポートできます

$user = User::where(&#39;info->nickname&#39;,&#39;流年&#39;)->find();
echo $user->name; // thinkphp
echo $user->info->email; // thinkphp@qq.com
echo $user->info->nickname; // 流年

Db クラス クエリと同様に、クエリする必要がある JSON 属性が整数型の場合は、手動パラメータ バインディングが必要です。

$user = User::where(&#39;info->user_id&#39;,&#39;:user_id&#39;)
->bind([&#39;user_id&#39; => [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 = [&#39;info&#39;];
    
    // 设置JSON字段的类型
    protected $jsonType = [
    &#39;user_id&#39;=>&#39;int&#39;
    ];
}

タイプが定義されていない属性はデフォルトで文字列タイプになるため、文字列タイプの属性を定義する必要はありません。

データの更新

JSON データの更新にもオブジェクトが使用されます

$user = User::get(1);
$user->name = &#39;kancloud&#39;;
$user->info->email = &#39;kancloud@qq.com&#39;;
$user->info->nickname = &#39;kancloud&#39;;
$user->save();

JSON タイプのフィールドに対してより複雑な操作を実行する必要がある場合は、完了することもできます。 exp式で。これは、誰もが JSON の使用法をさらに発見するのを待っています。

PHP 中国語 Web サイトには、無料の

ThinkPHP 入門チュートリアル が多数あり、誰でも学習することができます。

この記事は https://blog.thinkphp.cn/784281

から転載しています。

以上がThinkPHP: JSON フィールド タイプ (ORM) の使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はthinkphp.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。