Definieren Sie den Getter
Die Funktion des Getters besteht darin, die (Roh-)Daten des Modells automatisch zu verarbeiten Objekt. Ein Getter entspricht einer speziellen Methode des Modells (die Methode muss vom öffentlichen Typ sein:
getFieldNameAttr
FieldName ist die Kamel-Schreibweise). Konvertierung des Datentabellenfelds Oder eines Felds, das in Ihrer Datentabelle nicht vorhanden ist (Achten Sie darauf, den folgenden Satz zu verstehen. Das Folgende ist eine typische Getter-Definition:
<?php namespace app\index\model; use think\Model; class User extends Model { public function getUserTypeAttr($value, $data) { $type = [0 => '普通', 1 => 'VIP', 2 => '黄金', 3 => '白金', 4 => '钻石']; return $type[$value]; } }
Sie müssen einen entsprechenden Getter definieren). Jedes Datenfeld, das eine Ausgabekonvertierung erfordert, muss jedoch nicht mit dem Feldnamen der Datentabelle übereinstimmen. Wenn ich beispielsweise einen Getter mit dem Namen getTypeAttr für das Feld user_type definieren möchte, ist dies der Fall Dies ist ebenfalls zulässig, es ist jedoch zu beachten, dass der erste Parameter zu diesem Zeitpunkt an den Getter übergeben wird. Der Parameter darf keinen Wert haben (da keine entsprechenden Datentabellenfelddaten vorhanden sind) und Sie können die benötigten Daten nur über den zweiten Parameter abrufen .
<?php namespace app\index\model; use think\Model; class User extends Model { public function getTypeAttr($value, $data) { $type = [0 => '普通', 1 => 'VIP', 2 => '黄金', 3 => '白金', 4 => '钻石']; return $type[$data['user_type']]; } }
Natürlich müssen Sie in strengeren Fällen auch feststellen, ob $data['user_type'] vorhanden ist, was vorerst übersprungen wird.
Beachten Sie, dass die Daten des zweiten Parameters möglicherweise vom Getter selbst verarbeitet wurden (sofern Sie den entsprechenden Getter definieren).
Warum einen Getter definieren, der nicht mit dem Datagrammfeld übereinstimmt? Der offensichtlichste Vorteil ist die Möglichkeit, zwischen verschiedenen Feldern zu unterscheiden, um Rohdaten und verarbeitete Daten zu erhalten. Tatsächlich gibt es viele Gründe dafür, einige Feld-Getter zu definieren, die in der Datentabelle nicht vorhanden sind. Das ist genau das, was den Charme von Gettern ausmacht.
Es ist ersichtlich, dass die Definition des Getters selbst nicht schwierig ist. Der Schlüssel liegt in der Erfassungslogik in der Methode, die in praktischen Anwendungen am wichtigsten ist.
Getter aufrufen
Nachdem der Getter definiert wurde, wird er in den folgenden Situationen automatisch ausgelöst:
·Die Datenobjektwertoperation des Modells (z. B. $model->field_name);
·Die serialisierte Ausgabeoperation des Modells (wie $model-> toArray() oder toJson());
·Rufen Sie explizit die getAttr-Methode auf (wie $model->getAttr ('field_name'));
Die ersten beiden werden tatsächlich durch den Aufruf des letzten implementiert. Das Wichtigste ist, den ersten zu verstehen. Der Wert eines Modellobjekts wird im Allgemeinen auf folgende Weise ermittelt:
$user = User::get(1); echo $user->name; echo $user->user_type;
Wenn wir die obige Methode verwenden, um Modellobjektdaten abzurufen oder die Vorlage auszugeben, werden wir die Daten tatsächlich in der folgenden Reihenfolge erkennen und abrufen. .
·Schritt 1 – Wenn das Abfrageergebnis die Felddaten enthält, rufen Sie die Originaldaten ab, andernfalls fahren Sie mit Schritt 2 fort;
·Schritt 2 – Überprüfen Sie, ob der Getter (einschließlich dynamischer Getter) für dieses Feld definiert ist. Wenn nicht, fahren Sie mit Schritt 3 fort >
·Schritt 3 – Überprüfen Sie, ob die Feldtypkonvertierung definiert ist. Wenn ja, führen Sie die Konvertierungsverarbeitung durch und geben Sie das Ergebnis zurück. Wenn nicht, fahren Sie mit Schritt 4 fort;
·Schritt 4 – Wenn es sich um ein Systemzeitfeld handelt, formatieren Sie die Zeit automatisch und geben Sie das Ergebnis zurück, andernfalls fahren Sie mit Schritt 5 fort; 🎜>·
Schritt 5 – Wenn die Felddaten nicht in der Prüfung in Schritt 1 enthalten sind, prüfen Sie, ob eine zugehörige Attributdefinition vorhanden ist, und wenn ja, beziehen Sie die Daten über die zugehörige Beziehung und Gibt das Ergebnis zurück, andernfalls wird eine nicht definierte Eigenschaftsausnahme ausgelöst. Für den detaillierten Code der oben genannten fünf Schritte können Sie bei Interesse direkt auf den getAttr-Methodencode von thinkmodelconcernAttribute verweisen.
Einfach ausgedrückt: Wenn Sie $user->user_type erhalten, prüfen Sie, ob der entsprechende Getter definiert ist, unabhängig davon, ob das Feld user_type ein echtes Datentabellenfeld ist. Aber in vielen Fällen erhalten Sie die Modelldaten nicht einzeln, sondern geben die gesamten Modelldaten an den Client oder die Vorlage zurück.
public function index() { $user = User::get(1); return json($user); }
In diesem Fall wird die toJson-Verarbeitung des Modells tatsächlich durchgeführt, wenn auf die Ausgabe reagiert wird.
Ein wichtiger Punkt ist, dass, wenn Ihr Getter Felder definiert, die keine Datentabellen sind, diese nicht automatisch ausgegeben werden. Sie müssen zusätzliche Attribute über die Append-Methode hinzufügen (und das Anhängen zugehöriger Modellattribute unterstützen).
Wenn wir einen Getter für das Typattribut definieren (vorausgesetzt, es handelt sich nicht um ein echtes Datentabellenfeld), müssen Sie für die normale Ausgabe die folgende Methode verwenden (andernfalls haben Sie möglicherweise nur Benutzertypdaten):
public function index() { $user = User::get(1); return json($user->append(['type'])); }
Wenn Sie toArray verwenden, ist die Verarbeitungsmethode dieselbe.
Wenn es sich um eine Datensatzabfrage handelt, können Sie auch die Append-Methode verwenden, um zusätzliche Felder einheitlich anzuhängen.
public function index() { $users = User::all(); return json($users->append(['type'])); }
Rohdaten abrufen
有些情况下,除了要获取处理过的数据外,还需要获取原始数据以便应对不同的需求。
如果你的获取器都是用的区分于实际数据表字段的额外属性字段,那么这个问题本身已经解决了。所以我们主要讨论的是当你的获取器属性和数据表字段一致的情况下,该如何获取原始数据。
一个最简单的办法是使用getData方法:
$user = User::get(1); // 获取user_type获取器数据 echo $user->user_type; // 获取原始的user_type数据 echo $user->getData('user_type'); // 获取全部原始数据 dump($user->getData());
动态获取器
前面我们提到过动态获取器的概念,动态获取器就是不需要在模型类里面定义获取器方法,而是在查询的时候使用闭包来定义一个字段的获取器对数据进行统一的处理。
User::withAttr('name', function($value, $data) { return strtolower($value); })->select();
如果你需要定义多个动态获取器,多次调用withAttr方法就行。
动态获取器的意义除了可以不用在模型里面定义获取器方法之外,还可以起到覆盖已经定义的获取器的作用,并且动态获取器可以支持Db类操作,弥补了Db操作不能使用获取器的缺憾,具体就看自己的需求来选择了。
Db::name('user')->withAttr('name', function($value, $data) { return strtolower($value); })->select();
总结
无论是获取器,还是之前提的修改器、搜索器,其作用无非是把你的模型工作细化和拆分,这样代码和逻辑也会更清晰,可维护性也大大增强,至于性能,从来不是模型首先考虑的。
PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!
本文转自:https://blog.thinkphp.cn/825350
Das obige ist der detaillierte Inhalt vonThinkPHP: Das dritte von drei leistungsstarken Tools für Modelle (Getter). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!