Maison  >  Article  >  cadre php  >  La définition et l'utilisation des modèles d'association dans thinkphp5

La définition et l'utilisation des modèles d'association dans thinkphp5

尚
avant
2020-04-25 09:20:522786parcourir

La définition et l'utilisation des modèles d'association dans thinkphp5

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 un nouveau fichier de classe de modèle correspondant aux deux tables 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 :

La définition et lutilisation des modèles dassociation dans thinkphp5

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('associated model name', 'nom de clé étrangère', 'Nom de clé primaire',['Définition d'alias de modèle'],'type de jointure');

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;);
    }
}


?>

Une fois que le modèle Admin a défini les méthodes associées, il n'est pas nécessaire d'écrire de méthodes correspondantes dans le modèle AdminMessage, mais il doit y en avoir au moins 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. Le système obtient le testament correspondant. être automatiquement converti lors de la lecture de l'attribut associé user_profile, et la méthode associée correspondante doit être userProfile.

Appel du contrôleur

Si vous souhaitez utiliser le modèle associé dans le contrôleur, vous devez d'abord introduire la classe de modèle. Par exemple, si j'ai défini la méthode associée dans le modèle d'administration ci-dessus, vous devez introduire le modèle d'administrateur.

utilisez appindexmodelAdmin

<?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());
    }
    ?>

Résultat d'exécution :

La définition et lutilisation des modèles dassociation dans thinkphp5

Si votre résultat est comme ceci, vous n'avez que des données dans la table administrateur admin, ne t'inquiète 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 du 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);
        }
    }
  ?>

Le résultat obtenu est :

La définition et lutilisation des modèles dassociation dans thinkphp5

Parce que c'est un test et par commodité, je n'utilise pas de nombres numériques. C'est plus intuitif et clair. pour utiliser directement les codes de texte.

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

Résultat de sortie :

La définition et lutilisation des modèles dassociation dans thinkphp5

Définir l'association un-à-plusieurs

L'utilisation de l'association un-à-plusieurs et un-à-plusieurs une association 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('nom du modèle associé', 'nom de la clé étrangère', 'nom de la clé primaire', ['définition de l'alias du modèle']); >

Les deux tableaux ci-dessus sont toujours utilisés à titre d'exemple, mais afin de correspondre à l'association un-à-plusieurs, le contenu de pwn_admin_message et le champ aid doivent être légèrement modifiés. 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 :

La définition et lutilisation des modèles dassociation dans thinkphp5

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

La définition et lutilisation des modèles dassociation dans thinkphp5

有几个管理员没有数据,不过没关系足够测试就可以了。好了废话不多说,开始进入正题。
相信大家一看就知道下面这个是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;);
    }
}

而这下面这个是 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;);
    }
    */
}
?>

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

<?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());
        }
    }
}
?>

输出结果:

La définition et lutilisation des modèles dassociation dans thinkphp5

还有两个函数也顺便说一下了,一个是 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());
    }
   }

   ?>

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

La définition et lutilisation des modèles dassociation dans thinkphp5如果按 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());
    }
   }
  ?>

就会报出如下错误:

La définition et lutilisation des modèles dassociation dans thinkphp5

推荐教程:thinkphp教程

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