Définir une association un-à-un
On suppose que vous avez configuré l'environnement thinkphp5 et que la connexion à la base de données est OK. Je souhaite associer deux tables via le modèle, puis obtenir les informations des deux tables en appelant le contrôleur.
Maintenant, j'ai préparé deux tables, une table d'administrateur pwn_admin et une table d'informations d'administrateur pwn_admin_message Afin de faciliter la compréhension, j'ai également publié les structures des deux tables.
Voici les informations sur la structure des deux tables :
CREATE TABLE `pwn_admin` ( `id` int(6) NOT NULL AUTO_INCREMENT, `user` varchar(30) NOT NULL DEFAULT '', `password` varchar(50) NOT NULL DEFAULT '', `name` varchar(50) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;
CREATE TABLE `pwn_admin_message` ( `id` int(6) NOT NULL AUTO_INCREMENT, `email` varchar(30) NOT NULL DEFAULT '', `mobile` varchar(50) NOT NULL DEFAULT '', `aid` int(11) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Fichier modèle
L'étape suivante consiste à créer une nouvelle classe de modèle correspondant au document de deux tableaux de données. Créez un nouveau répertoire de modèles sous le module puis créez deux nouveaux fichiers et nommez-les selon les tableaux correspondants :
Nom du modèle
La règle de dénomination pour Les classes de modèles consistent à supprimer la table. Le nom de la table de données préfixée est nommé en casse chameau avec la première lettre en majuscule. Par exemple, le préfixe de table des deux tables ci-dessus est pwn_, qui doit être omis dans le nom du modèle. Par conséquent, le nom de classe de modèle de la table pwn_admin est Admin et le nom de classe de modèle de pwn_admin_message est AdminMessage
Les paramètres de la méthode hasOne incluent :
hasOne(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’],’join类型’);
Le type de jointure par défaut est INNER
Définition du modèle
Le modèle Admin correspond à la table pwn_admin
<?php namespace app\index\model; use think\Model; class Admin extends Model{ function AdminMessage(){ //aid为外键id是adminmessage表关联admin表的外键 //id是 admin表的主键 return $this->hasOne('AdminMessage','aid','id')->field('id,coltype,auth,name,intro,xuhao,pid,pname'); } } ?>
Une fois que le modèle Admin a défini les méthodes associées, il n'est pas nécessaire d'en écrire méthodes correspondantes dans le modèle AdminMessage, mais il doit y en avoir au moins. Il doit y avoir un modèle vide correspondant à la table pwn_admin_message.
De manière correspondante, si vous écrivez
<?php namespace app\index\model; use think\Model; class AdminMessage extends Model{ } ?>
dans ce modèle, une chose à noter est que la convention de dénomination des méthodes associées est la casse camel, tandis que les attributs associés sont généralement en minuscules + soulignés. convertir automatiquement le correspondant lors de son obtention. Lors de la lecture de l'attribut associé user_profile, la méthode associée correspondante doit être userProfile.
Appel du contrôleur
Si le contrôleur souhaite utiliser le modèle associé, il doit d'abord introduire la classe de modèle. Par exemple, j'ai défini la méthode associée dans l'administrateur. modèle ci-dessus. Vous devez introduire le modèle admin dans le contrôleur.
use app\index\model\Admin
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class Index extends Controller { /** * @param string $name */ public function index($name='name') { //get 1 是获取id为 1 的数据 //find() 是查找 //toArray() 是获取到的数据转为数组 $admin= Admin::get(1); var_dump($admin->find()->toArray()); } ?>
Vous pouvez visiter le navigateur suivant pour voir les résultats :
Si votre résultat est comme ceci, vous n'avez que les données de la table administrateur admin, ne vous inquiétez pas, c'est normal. Si vous souhaitez obtenir les données de la table associée pwn_admin_message, vous devez d'abord appeler la méthode modèle AdminMessage() que vous venez de définir, puis pointer sur la méthode find() pour récupérer les données.
Remarque :
Cette méthode find() ne peut pas être omise. Je n'ai pas pu récupérer les informations complètes de l'administrateur car je n'ai pas ajouté cette méthode.
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin= Admin::get(1); //查询出pwn_admin_message 表aid为 1 的一条数据,然后转数组。 $admin= $admin->AdminMessage->find()->toArray(); var_dump($admin); } } ?>
Le résultat obtenu est
Parce qu'il s'agit d'un test et par commodité, je n'utilise pas de chiffres numériques directement, ce qui est le cas. est plus intuitif et clair.
Méthode hasWhere() :
Si vous souhaitez interroger les données du modèle actuel en fonction des conditions de requête de la table associée, vous pouvez utiliser la méthode hasWhere, par exemple :
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin=Admin::hasWhere('AdminMessage',['email'=>'guanliB@ggg.com']); $admin=$admin->find()->toArray(); var_dump($admin); } } ?>
Résultat de sortie :
Définir une association un-à-plusieurs
Association un-à-plusieurs et association un-à-un L'utilisation est presque la même, la différence est que les noms de méthodes sont différents. Le nom de la méthode utilisée dans le modèle pour un à plusieurs est hasMany. Les méthodes d'utilisation et les paramètres de hasMany et hasOne sont fondamentalement les mêmes.
Le paramètre hasMany est :
hasMany(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);
En prenant toujours les deux tables ci-dessus comme exemple, mais afin de correspondre à l'association un-à-plusieurs, le contenu de pwn_admin_message et le champ d'aide doivent être légèrement modifié. Remplacez-le par un administrateur avec plusieurs numéros de téléphone mobile et plusieurs adresses e-mail.
Afin de faciliter la compréhension, j'ai des captures d'écran du contenu des données des deux tables.
L'image suivante est le contenu de la table pwn_admin_message :
L'image suivante est le contenu de la table pwn_admin :
Il y a quelques administrateurs qui n'ont pas de données, mais cela n'a pas d'importance tant qu'elles sont suffisantes pour les tests. Bon, sans plus tarder, venons-en au fait.
相信大家一看就知道下面这个是admin模型的内容,对应的是pwd_admin 表
<?php namespace app\index\model; use think\Model; class Admin extends Model{ public function AdminMessage(){ //pid为外键id是adminmessage表关联admin表的外键 //id是 admin表的主键 return $this->hasMany('AdminMessage','aid','id'); } }
而这下面这个是 AdminMessage 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型
<?php namespace app\index\model; use think\Model; class AdminMessage extends Model{ /* function Admin(){ return $this->belongsTo('Admin','aid','id'); } */ } ?>
控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { $admin= Admin::get(1); //查找出 pwn_admin_message 表关联aid为1是所有数据 $admin= $admin->AdminMessage()->select(); for($i=0;$i<count($admin);$i++){ var_dump($admin $i]->toArray()); } } } ?>
输出结果:
还有两个函数也顺便说一下了,一个是 hasWhere 还有一个 has 这两个都是根据关联条件来查询的,通俗点讲就是根据关联到 pwd_admin 表,的 pwn_admin_message 表字段的条件来查询的。如果换过来用pwd_admin里的字段作为条件查询的话就会报错。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { // $admin= Admin::get(1); $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select(); $list1=Admin::has('AdminMessage',['aid'=>2])->select(); var_dump($list1[0]->toArray()); } } ?>
这样子关联得出的结果是正常的:
如果按 pwd_admin 表的字段做为搜索条件就会报错。比如我用一个 pwn_admin_message 没有的字段,用user字段来做为条件查询试试。
<?php namespace app\index\controller; use think\Controller; use app\index\model\Admin; class index extends Controller { /** * @param string $name */ public function index($name='name') { // $admin= Admin::get(1); // $list= Admin::hasWhere('AdminMessage',['aid'=>1])->select(); $list1=Admin::has('AdminMessage',['user'=>'jiehechen123'])->select(); var_dump($list1[0]->toArray()); } } ?>
就会报出如下错误:
推荐教程:《TP5》
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!