Maison > cadre php > PensezPHP > Introduction à la définition et à l'utilisation des modèles d'association thinkphp

Introduction à la définition et à l'utilisation des modèles d'association thinkphp

Libérer: 2020-05-11 09:28:34
avant
2451 Les gens l'ont consulté

Introduction à la définition et à l'utilisation des modèles d'association thinkphp

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;
Copier après la connexion
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;
Copier après la connexion

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 :

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

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类型’);
Copier après la connexion

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(&#39;AdminMessage&#39;,&#39;aid&#39;,&#39;id&#39;)->field(&#39;id,coltype,auth,name,intro,xuhao,pid,pname&#39;);
    }
}


?>
Copier après la connexion

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{

}
?>
Copier après la connexion

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
Copier après la connexion
<?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Admin;

class Index extends Controller
{
    /**
     * @param string $name
     */
    public function index($name=&#39;name&#39;)
    {
        //get 1 是获取id为 1 的数据
        //find() 是查找
        //toArray()  是获取到的数据转为数组
       $admin= Admin::get(1);
    var_dump($admin->find()->toArray());
    }
    ?>
Copier après la connexion

Vous pouvez visiter le navigateur suivant pour voir les résultats :

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

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=&#39;name&#39;)
    {
       $admin= Admin::get(1);
       //查询出pwn_admin_message 表aid为 1 的一条数据,然后转数组。
       $admin= $admin->AdminMessage->find()->toArray();  
        var_dump($admin);
        }
    }
  ?>
Copier après la connexion

Le résultat obtenu est

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

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=&#39;name&#39;)
    {
        $admin=Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;email&#39;=>&#39;guanliB@ggg.com&#39;]);
        $admin=$admin->find()->toArray();
        var_dump($admin);
    }
   }
    ?>
Copier après la connexion

Résultat de sortie :

Introduction à la définition et à lutilisation des modèles dassociation thinkphp


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(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);
Copier après la connexion

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 :

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

L'image suivante est le contenu de la table pwn_admin :

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

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(&#39;AdminMessage&#39;,&#39;aid&#39;,&#39;id&#39;);
    }
}
Copier après la connexion

而这下面这个是 AdminMessage 对应的是哪张表我就不说了。这和一对一关联一样也可以是个空模型

<?php
namespace app\index\model;
use think\Model;

class AdminMessage extends Model{
    /*    
    function Admin(){
      return $this->belongsTo(&#39;Admin&#39;,&#39;aid&#39;,&#39;id&#39;);
    }
    */
}
?>
Copier après la connexion

控制器调用,这回就有点不一样了。因为返回的数据是一个二维数组里面包含了多个对象所以需要把数组循环出来并把对象在转为数组才能输出

<?php
namespace app\index\controller;
use think\Controller;
use app\index\model\Admin;

class index extends Controller
{
    /**
     * @param string $name
     */
    public function index($name=&#39;name&#39;)
    {
       $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());
        }
    }
}
?>
Copier après la connexion

输出结果:

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

还有两个函数也顺便说一下了,一个是 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=&#39;name&#39;)
    {
     //  $admin= Admin::get(1);
     $list= Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;aid&#39;=>1])->select();
     $list1=Admin::has(&#39;AdminMessage&#39;,[&#39;aid&#39;=>2])->select();
    var_dump($list1[0]->toArray());
    }
   }

   ?>
Copier après la connexion

这样子关联得出的结果是正常的:

Introduction à la définition et à lutilisation des modèles dassociation thinkphp

如果按 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=&#39;name&#39;)
    {
     //  $admin= Admin::get(1);
    // $list= Admin::hasWhere(&#39;AdminMessage&#39;,[&#39;aid&#39;=>1])->select();
     $list1=Admin::has(&#39;AdminMessage&#39;,[&#39;user&#39;=>&#39;jiehechen123&#39;])->select();
     var_dump($list1[0]->toArray());
    }
   }
  ?>
Copier après la connexion

就会报出如下错误:

1Introduction à la définition et à lutilisation des modèles dassociation thinkphp

推荐教程:《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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal