Heim  >  Artikel  >  PHP-Framework  >  Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

尚
nach vorne
2020-04-25 09:20:522928Durchsuche

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

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 neue Modellklassendatei zu erstellen, die den beiden Datentabellen entspricht . Erstellen Sie ein neues Modellverzeichnis unter dem Modul und erstellen Sie dann zwei neue Dateien und benennen Sie diese gemäß den entsprechenden Tabellen:

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Modellbenennung

Die Benennungsregel für Die Modellklasse besteht darin, die Tabelle zu entfernen. Der vorangestellte Datentabellenname wird in Kamel-Groß-/Kleinschreibung benannt und der erste Buchstabe wird großgeschrieben. 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('associated model name', 'Fremdschlüsselname',' Primärschlüsselname',['Modellaliasdefinition'],'Join-Typ');

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 entsprechenden Methoden im AdminMessage-Modell geschrieben werden, aber es muss welche geben mindestens ein leeres Modell, 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. Das System erhält den entsprechenden Willen wird beim Lesen des zugehörigen Attributs user_profile automatisch konvertiert, und die entsprechende zugeordnete Methode sollte userProfile sein.

Controller-Aufruf

Wenn Sie das zugehörige Modell im Controller verwenden möchten, müssen Sie zuerst die Modellklasse einführen. Wenn ich beispielsweise die zugehörige Methode oben im Admin-Modell definiert habe, Sie müssen das Admin-Controller einführen.

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

Laufendes Ergebnis:

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Wenn Ihr Ergebnis so ist, haben Sie nur Daten in der Admin-Administratortabelle. 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:

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

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

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:

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Eins-zu-viele-Zuordnung definieren

Die Verwendung von Eins-zu-viele-Zuordnung und Eins-zu- Eine Assoziation 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('assoziierter Modellname', 'Fremdschlüsselname', 'Primärschlüsselname', ['Modellaliasdefinition']); >

Ich nehme immer noch die beiden oben genannten Tabellen als Beispiel, aber um den Inhalt und das Hilfefeld der Eins-zu-Viele-Zuordnung von pwn_admin_message anzupassen, müssen sie leicht geändert 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:

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Das folgende Bild ist der Inhalt der pwn_admin-Tabelle:

Die Definition und Verwendung von Assoziationsmodellen in 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());
        }
    }
}
?>

输出结果:

Die Definition und Verwendung von Assoziationsmodellen in 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());
    }
   }

   ?>

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

Die Definition und Verwendung von Assoziationsmodellen in 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());
    }
   }
  ?>

就会报出如下错误:

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

推荐教程:thinkphp教程

Das obige ist der detaillierte Inhalt vonDie Definition und Verwendung von Assoziationsmodellen in thinkphp5. 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