Heim  >  Artikel  >  PHP-Framework  >  Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

尚
nach vorne
2020-05-11 09:28:342352Durchsuche

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Eindeutige Zuordnung definieren

Es wird davon ausgegangen, dass Sie die thinkphp5-Umgebung konfiguriert haben und die Datenbankverbindung in Ordnung ist. Ich möchte zwei Tabellen über das Modell verknüpfen und dann die Informationen der beiden Tabellen durch Aufrufen des Controllers abrufen.

Jetzt habe ich zwei Tabellen vorbereitet, eine Administratortabelle pwn_admin und eine Administratorinformationstabelle pwn_admin_message. Um das Verständnis zu erleichtern, habe ich auch die Tabellenstrukturen der beiden Tabellen gepostet.

Das Folgende sind die Tabellenstrukturinformationen der beiden Tabellen:

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;

Modelldatei

Der nächste Schritt besteht darin, eine entsprechende neue Modellklasse zu erstellen zum Dokument mit den beiden Datentabellen. Erstellen Sie ein neues Modellverzeichnis unter dem Modul und erstellen Sie dann zwei neue Dateien und benennen Sie diese gemäß den entsprechenden Tabellen:

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Modellbenennung

Die Benennungsregel für Die Modellklasse besteht darin, die Tabelle zu entfernen. Der vorangestellte Datentabellenname wird in Kamel-Schreibweise benannt, wobei der erste Buchstabe groß geschrieben wird. Das Tabellenpräfix der beiden oben genannten Tabellen lautet beispielsweise pwn_ und muss im Modellnamen weggelassen werden. Daher lautet der Modellklassenname der pwn_admin-Tabelle Admin und der Modellklassenname von pwn_admin_message AdminMessage

Die Parameter der hasOne-Methode umfassen:

hasOne(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’],’join类型’);

Der Standard-Join-Typ ist INNER

Modelldefinition

Das Admin-Modell entspricht der pwn_admin-Tabelle

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


?>

Nachdem das Admin-Modell die zugehörigen Methoden definiert, müssen keine geschrieben werden entsprechende Methoden im AdminMessage-Modell, es muss jedoch mindestens ein leeres Modell vorhanden sein, das der Tabelle pwn_admin_message entspricht.

Wenn Sie in diesem Modell

<?php
namespace app\index\model;

use think\Model;
class AdminMessage extends Model{

}
?>

schreiben, ist zu beachten, dass die Namenskonvention für zugehörige Methoden die Kamelschreibung ist, während zugehörige Attribute im Allgemeinen in Kleinbuchstaben + Unterstrichen geschrieben sind Konvertieren Sie das entsprechende Attribut automatisch, wenn Sie es erhalten. Beim Lesen des zugehörigen Attributs user_profile sollte die entsprechende zugeordnete Methode userProfile sein.

Controller-Aufruf

Wenn der Controller das zugehörige Modell verwenden möchte, muss er zuerst die Modellklasse einführen. Ich habe beispielsweise die zugehörige Methode im Admin definiert Modell oben. Sie müssen das Admin-Modell in den Controller einführen.

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=&#39;name&#39;)
    {
        //get 1 是获取id为 1 的数据
        //find() 是查找
        //toArray()  是获取到的数据转为数组
       $admin= Admin::get(1);
    var_dump($admin->find()->toArray());
    }
    ?>

Sie können den folgenden Browser besuchen, um die Ergebnisse anzuzeigen:

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Wenn Ihr Ergebnis so aussieht, haben Sie nur Daten aus der Admin-Administrator-Tabelle. Mach dir keine Sorgen. Das ist normal. Wenn Sie die Daten der zugehörigen Tabelle pwn_admin_message abrufen möchten, müssen Sie zuerst die gerade definierte Modellmethode AdminMessage () aufrufen und dann auf die Methode find () verweisen, um die Daten abzurufen.

Hinweis:

Diese find()-Methode kann nicht weggelassen werden. Ich konnte die vollständigen Administratorinformationen nicht abrufen, da ich diese Methode nicht hinzugefügt habe.

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

Das erhaltene Ergebnis ist

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Da es sich um einen Test handelt und ich der Einfachheit halber keine numerischen Zahlen verwende, verwende ich diese ist intuitiver und klarer.

hasWhere()-Methode:

Wenn Sie die Daten des aktuellen Modells basierend auf den Abfragebedingungen der zugehörigen Tabelle abfragen möchten, können Sie die hasWhere-Methode verwenden, zum Beispiel:

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

Ausgabeergebnis:

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen


Eins-zu-viele-Zuordnung definieren

Eins-zu-viele-Assoziation und Eins-zu-eins-Assoziation Die Verwendung ist fast gleich, der Unterschied besteht darin, dass die Methodennamen unterschiedlich sind. Der im Modell für Eins-zu-Viele verwendete Methodenname lautet hasMany. Die Verwendungsmethoden und Parameter von hasMany und hasOne sind grundsätzlich gleich.

hasMany-Parameter ist:

hasMany(‘关联模型名’,’外键名’,’主键名’,[‘模型别名定义’]);

Nehmen wir immer noch die beiden oben genannten Tabellen als Beispiel, aber um der Eins-zu-viele-Zuordnung zu entsprechen, müssen der Inhalt von pwn_admin_message und das Hilfsfeld übereinstimmen leicht modifiziert werden. Ändern Sie es in einen Administrator mit mehreren Mobiltelefonnummern und mehreren E-Mail-Adressen.

Um das Verständnis zu erleichtern, habe ich Screenshots des Dateninhalts der beiden Tabellen.

Das folgende Bild ist der Inhalt der pwn_admin_message-Tabelle:

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Das folgende Bild ist der Inhalt der pwn_admin-Tabelle:

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

Es gibt ein paar Administratoren, die keine Daten haben, aber das spielt keine Rolle, gerade genug zum Testen. Okay, kommen wir ohne weitere Umschweife zum Punkt.

相信大家一看就知道下面这个是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());
        }
    }
}
?>

输出结果:

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

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

   ?>

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

Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

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

就会报出如下错误:

1Einführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen

推荐教程:《TP5

Das obige ist der detaillierte Inhalt vonEinführung in die Definition und Verwendung von thinkphp-Assoziationsmodellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen