Heim PHP-Framework Denken Sie an PHP Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Die Definition und Verwendung von Assoziationsmodellen in thinkphp5

Apr 25, 2020 am 09:20 AM
thinkphp5

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;
Nach dem Login kopieren
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;
Nach dem Login kopieren

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


?>
Nach dem Login kopieren

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{


}
?>
Nach dem Login kopieren

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());
    }
    ?>
Nach dem Login kopieren

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);
        }
    }
  ?>
Nach dem Login kopieren

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);
    }
   }
    ?>
Nach dem Login kopieren

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;);
    }
}
Nach dem Login kopieren

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

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

<?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());
        }
    }
}
?>
Nach dem Login kopieren

输出结果:

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

   ?>
Nach dem Login kopieren

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

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());
    }
   }
  ?>
Nach dem Login kopieren

就会报出如下错误:

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was soll ich tun, wenn ich beim Bereitstellen von thinkphp5 in Pagoda eine Fehlermeldung erhalte? Was soll ich tun, wenn ich beim Bereitstellen von thinkphp5 in Pagoda eine Fehlermeldung erhalte? Dec 19, 2022 am 11:04 AM

Lösung für den bei der Bereitstellung von thinkphp5 in Pagoda gemeldeten Fehler: 1. Öffnen Sie den Pagoda-Server, installieren Sie die PHP-Pathinfo-Erweiterung und aktivieren Sie sie. 2. Konfigurieren Sie die Datei „.access“ mit dem Inhalt „RewriteRule ^(.*)$ index.php ?s=/$1 [QSA ,PT,L]“; 3. Aktivieren Sie in der Website-Verwaltung einfach die Pseudostatik von thinkphp.

Was soll ich tun, wenn thinkphp5 post den Wert nicht abrufen kann? Was soll ich tun, wenn thinkphp5 post den Wert nicht abrufen kann? Dec 06, 2022 am 09:29 AM

thinkphp5-Beitrag kann keinen Wert abrufen, da TP5 die strpos-Funktion verwendet, um den app/json-String im Inhaltstypwert des Headers zu finden. Die Lösung besteht darin, den Inhaltstypwert des Headers auf app/json zu setzen.

So erhalten Sie die angeforderte URL in thinkphp5 So erhalten Sie die angeforderte URL in thinkphp5 Dec 20, 2022 am 09:48 AM

Methoden für thinkphp5 zum Abrufen der angeforderten URL: 1. Verwenden Sie die Methode „$request = Request::instance();“ der Klasse „\think\Request“, um die aktuellen URL-Informationen abzurufen Funktion „$request->url()“, um die vollständige URL-Adresse einschließlich des Domainnamens zu erhalten.

Was soll ich tun, wenn das Umschreiben der thinkphp5-URL fehlschlägt? Was soll ich tun, wenn das Umschreiben der thinkphp5-URL fehlschlägt? Dec 12, 2022 am 09:31 AM

Lösung dafür, dass das Umschreiben von thinkphp5-URLs nicht funktioniert: 1. Überprüfen Sie, ob das Modul mod_rewrite.so in der Konfigurationsdatei httpd.conf geladen ist. 2. Ändern Sie None in AllowOverride None in All. 3. Ändern Sie die Apache-Konfigurationsdatei .htaccess in „RewriteRule ^“. (.*)$ index.php [L,E=PATH_INFO:$1]“ und speichern Sie es.

So entfernen Sie das Titelleistensymbol von thinkphp5 So entfernen Sie das Titelleistensymbol von thinkphp5 Dec 20, 2022 am 09:24 AM

So entfernen Sie das thinkphp5-Titelleistensymbol: 1. Suchen Sie die Datei favicon.ico unter dem öffentlichen thinkphp5-Framework. 2. Löschen Sie die Datei oder wählen Sie ein anderes Bild aus, um sie in favicon.ico umzubenennen und die ursprüngliche Datei favicon.ico zu ersetzen.

Was soll ich tun, wenn thinkphp5 meldet, dass der Controller nicht existiert? Was soll ich tun, wenn thinkphp5 meldet, dass der Controller nicht existiert? Dec 06, 2022 am 10:43 AM

Lösung für die Meldung thinkphp5, dass der Controller nicht existiert: 1. Überprüfen Sie, ob der Namespace im entsprechenden Controller korrekt geschrieben ist, und ändern Sie ihn in den richtigen Namespace. 2. Öffnen Sie die entsprechende tp-Datei und ändern Sie den Klassennamen.

So fragen Sie die Daten von gestern in ThinkPHP5 ab So fragen Sie die Daten von gestern in ThinkPHP5 ab Dec 05, 2022 am 09:20 AM

So fragen Sie die Daten von gestern in ThinkPHP5 ab: 1. Öffnen Sie ThinkPHP5-bezogene Dateien. 2. Fragen Sie die Daten von gestern über den Ausdruck „db('table')->whereTime('c_time', 'yesterday')->select();“ ab .

So legen Sie Fehlermeldungen in thinkphp5 fest So legen Sie Fehlermeldungen in thinkphp5 fest Dec 07, 2022 am 10:31 AM

So legen Sie Fehleraufforderungen in thinkphp5 fest: 1. Geben Sie den öffentlichen Ordner im Projektstammverzeichnis ein und öffnen Sie die Eintragsdatei index.php. 2. Sehen Sie sich die Kommentare zum Debug-Modus-Schalter an. 3. Passen Sie den Wert der Konstante „APP_DEBUG“ an auf „true“ setzen, um eine Fehlermeldung anzuzeigen.

See all articles