Maison >cadre php >PensezPHP >ThinkPHP : utilisation du type de champ JSON (ORM)

ThinkPHP : utilisation du type de champ JSON (ORM)

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼avant
2019-12-16 15:52:483842parcourir

ThinkPHP : utilisation du type de champ JSON (ORM)

ThinkPHP 5.1 est officiellement sorti depuis un certain temps, et je vais vous présenter ses nouvelles fonctionnalités les unes après les autres. Ce que je souhaite vous présenter aujourd'hui est une fonctionnalité que de nombreux utilisateurs ne comprennent peut-être pas encore : la prise en charge des données de champ JSON.

Mais tout d'abord, veuillez noter que le support des données de champ JSON décrites dans cet article a été introduit à partir de la version V5.1.4+. Il est recommandé de s'assurer d'utiliser la version 5.1.9+ en raison de l'inclusion de mises à jour de sécurité.

La définition du champ JSON dans cet article inclut le type JSON ou le type de caractère où les données enregistrées sont au format JSON. Par conséquent, en théorie, il n'y a aucune exigence concernant le type et la version de la base de données, sauf en utilisant une requête conditionnelle de champ JSON.

La classe Db fonctionne en JSON

Si vous n'utilisez pas la classe model, la classe Db fournit une méthode json pour spécifier votre Champs au format JSON de la table de données. Par exemple, votre table utilisateur comporte un champ d'informations de type JSON. Vous pouvez utiliser la méthode suivante pour manipuler les données.

Écriture des données

$user['name'] = 'thinkphp';
$user['info'] = [
'email'    => 'thinkphp@qq.com',
'nickname' => '流年',
];
Db::name('user')
->json(['info'])
->insert($user);

Le paramètre de la méthode json est un tableau Le champ info est spécifié dans l'exemple. En fait, plusieurs champs de type JSON peuvent être spécifiés. .

Requête de données

Interrogez l'intégralité des données JSON.

$user = Db::name('user')
->json(['info'])
->find(1);
dump($user);

Les données du résultat de la requête renvoyées incluront automatiquement un type de tableau de données d'informations, ce qui signifie que les données au format JSON ont été automatiquement traitées par json_decode.

Cette méthode de requête ne nécessite pas strictement l'utilisation du type JSON pour le champ d'information

Si vous devez interroger en fonction de la valeur des données JSON, vous pouvez utilisez la méthode suivante

$user = Db::name('user')
->json(['info'])
    ->where('info->nickname','ThinkPHP')
->find();
dump($user);

Nécessite que le champ d'information soit de type JSON. MySQL nécessite la version 5.7+ pour prendre en charge

Bien sûr, il peut également prendre en charge plusieurs- niveau

$user = Db::name('user')
->json(['info'])
    ->where('info->profile->nickname','ThinkPHP')
->find();
dump($user);

Étant donné que les types d'attributs des champs JSON ne le sont pas, il ne sera pas obtenu automatiquement, donc s'il s'agit d'une requête de données entières, une liaison manuelle des paramètres est requise, par exemple :

$user = Db::name('user')
->json(['info'])
    ->where('info->user_id', ':user_id')
    ->bind(['user_id' => [10, \PDO::PARAM_INT]])
->find();
dump($user);

Mise à jour des données

Mise à jour complète des données JSON

$data['info'] = [
'email'    => 'kancloud@qq.com',
'nickname' => 'kancloud',
];
Db::name('user')
->json(['info'])
    ->where('id',1)
->update($data);

Cette requête ne nécessite pas strictement l'utilisation du type JSON pour le champ d'information

Si vous venez de mettre à jour une certaine valeur dans les données JSON, vous pouvez utiliser la méthode suivante :

$data['info->nickname'] = 'ThinkPHP';
Db::name('user')
->json(['info'])
    ->where('id',1)
->update($data);

Il est également obligatoire que le champ d'information soit de type JSON

Le modèle exploite les données JSON

Si vous utilisez Si le modèle exploite la base de données, l'opération sur les données JSON sera encore plus simple.

Il suffit d'ajouter une définition d'attribut json à la classe de modèle User. L'attribut

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

json prend également en charge la définition de plusieurs noms de champs. Après la définition, les opérations de données JSON suivantes peuvent être effectuées.

Écrire des données

Utiliser la méthode tableau pour écrire des données 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();

Utiliser la méthode objet pour écrire des données 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();

Données de requête

Le type de résultat est différent de la requête de classe Db Le champ JSON du modèle sera automatiquement converti en mode objet.

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

peut également prendre en charge l'interrogation des données de champ 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; // 流年

Tout comme la requête Db, si l'attribut JSON que vous devez interroger est de type entier, une liaison manuelle des paramètres est requise.

$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; // 流年

Si vous utilisez la version V5.1.11+, vous pouvez définir le type d'attribut du champ JSON dans la classe de modèle, et le type de requête de liaison de paramètre correspondant sera automatiquement effectué.

<?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;
    ];
}

Les attributs sans type défini sont par défaut de type chaîne, donc les attributs de type chaîne n'ont pas besoin d'être définis.

Mettre à jour les données

La mise à jour des données JSON utilise également des objets

$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();

Si vous devez effectuer des opérations plus complexes sur des champs de type JSON, vous pouvez également Terminé par expression exp. Cela attend que tout le monde découvre davantage d’utilisations de JSON.

Le site Web PHP chinois propose un grand nombre de Tutoriels d'introduction ThinkPHP gratuits, tout le monde est invité à apprendre !

Cet article est reproduit à partir de : https://blog.thinkphp.cn/784281

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer