検索
ホームページPHPフレームワークThinkPHPThinkPHP: モデル用の 3 つの強力なツール (ゲッター) のうちの 3 番目

ThinkPHP: モデル用の 3 つの強力なツール (ゲッター) のうちの 3 番目

ゲッターの定義

ゲッターの機能は、モデルの (元の) データを自動的に処理することです。物体 。ゲッターはモデルの特別なメソッドに対応します (メソッドはパブリック タイプである必要があります)。メソッドの命名規則は次のとおりです:

getFieldNameAttr

FieldName はキャメル ケースですデータ テーブル フィールドの変換、またはデータ テーブルに存在しないフィールド (次の文の理解に注意してください) 以下は一般的なゲッター定義です:

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getUserTypeAttr($value, $data)
    {
        $type = [0 => &#39;普通&#39;, 1 => &#39;VIP&#39;, 2 => &#39;黄金&#39;, 3 => &#39;白金&#39;, 4 => &#39;钻石&#39;];
        return $type[$value];
    }
}

対応するゲッターを定義する必要があります。出力変換処理が必要な各データ フィールド。ただし、ゲッターのフィールド名はデータ テーブルのフィールド名と一致する必要はありません。たとえば、user_type フィールドに対して getTypeAttr という名前のゲッターを定義する場合、次のようになります。も許可されていますが、この時点で最初のパラメーターがゲッターに渡されることに注意する必要があります。パラメーターには値がなくてはならず (対応するデータ テーブル フィールド データがないため)、必要なデータは 2 番目のパラメーターを通じてのみ取得できます。 。

<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
    public function getTypeAttr($value, $data)
    {
        $type = [0 => &#39;普通&#39;, 1 => &#39;VIP&#39;, 2 => &#39;黄金&#39;, 3 => &#39;白金&#39;, 4 => &#39;钻石&#39;];
        return $type[$data[&#39;user_type&#39;]];
    }
}

もちろん、より厳密なケースでは、$data['user_type'] が存在するかどうかを判断する必要もありますが、ここではスキップします。

2 番目のパラメーターのデータ data 自体がゲッターによって処理されている可能性があることに注意してください (関連するゲッターを定義している場合)。

なぜデータグラム フィールドと矛盾するゲッターを定義する必要があるのでしょうか?最も明白な利点は、さまざまなフィールドを区別して生データと処理済みデータを取得できることです。実際、データ テーブルに存在しないフィールド ゲッターを定義する理由は数多くありますが、これがまさにゲッターの魅力です。

ゲッターの定義自体は難しくないことがわかりますが、鍵となるのはメソッド内の取得ロジックであり、実際のアプリケーションで最も注意すべき点です。

ゲッターを呼び出す

ゲッターを定義すると、次の状況でゲッターが自動的にトリガーされます:

·モデルのデータ オブジェクト値操作 ($model->field_name など);

·モデルのシリアル化された出力操作($model->toArray() や toJson() など);

##getAttr メソッドを明示的に呼び出します (例: $model->getAttr( 'field_name'));

最初の 2 つは、最後のものを呼び出すことによって実際に実装されます。最も重要なことは、最初のものを理解することです。モデル オブジェクトの値を取得する場合、一般的に次のメソッドを使用します。

$user = User::get(1);
echo $user->name;
echo $user->user_type;

上記のメソッドを使用してモデル オブジェクトのデータを取得したり、テンプレートを出力したりする場合、実際には、下記の順番です。

#ステップ 1 - クエリ結果にフィールド データが含まれている場合は、元のデータを取得します。それ以外の場合は、ステップ 2 に進みます。

·ステップ 2 - このフィールドのゲッター (動的ゲッターを含む) が定義されているかどうかを確認します。定義されている場合は、ゲッターを呼び出して結果を返します。そうでない場合は、ステップ 3 に進みます。

·ステップ 3 - フィールド型変換が定義されているかどうかを確認し、定義されている場合は変換処理を実行して結果を返します。定義されていない場合はステップ 4 に進みます。

·ステップ 4 - システム時刻フィールドの場合、時刻は自動的にフォーマットされて結果が返されます。それ以外の場合は、ステップ 5 に進みます。

##ステップ 5 - チェックの最初のステップにフィールド データが含まれていない場合は、関連付けられた属性定義があるかどうかを確認し、関連付けられている場合はデータを取得します。関連付けられたリレーションシップを介して結果を返します。それ以外の場合は、プロパティの未定義例外がスローされます。 上記の 5 つのステップの詳細なコードについては、興味があれば、think\model\concern\Attribute の getAttr メソッド コードを直接参照できます。

簡単に言えば、$user->user_type を取得すると、user_type フィールドが実際のデータ テーブル フィールドであるかどうかに関係なく、関連するゲッターが定義されているかどうかを確認します。

ただし、多くの場合、モデル データを 1 つずつ取得するのではなく、モデル データ全体をクライアントまたはテンプレートに返します。

public function index()
{
    $user = User::get(1);
    return json($user);
}

この場合、モデルの toJson 処理は、出力に応答するときに実際に実行されます。

1 つの重要な点は、ゲッターがデータ テーブルではないフィールドを定義している場合、それらのフィールドは自動的に出力されないということです。append メソッドを使用して追加の属性を追加する必要があります (および関連するモデル属性の追加をサポートします)。

type 属性のゲッターを定義する場合 (これが実際のデータ テーブル フィールドではないと仮定して)、次のメソッドを使用して通常どおり出力する必要があります (そうしないと、user_type データのみが存在する可能性があります):

public function index()
{
    $user = User::get(1);
    return json($user->append([&#39;type&#39;]));
}

toArray を使用している場合も処理方法は同じです。

データ セット クエリの場合は、append メソッドを使用して追加のフィールドを均一に追加することもできます。

public function index()
{
    $users = User::all();
    return json($users->append([&#39;type&#39;]));
}

append メソッドに加えて、一部のデータを一時的に非表示にするための hidden メソッドの使用もサポートされています。

元のデータを取得する

有些情况下,除了要获取处理过的数据外,还需要获取原始数据以便应对不同的需求。

如果你的获取器都是用的区分于实际数据表字段的额外属性字段,那么这个问题本身已经解决了。所以我们主要讨论的是当你的获取器属性和数据表字段一致的情况下,该如何获取原始数据。

一个最简单的办法是使用getData方法:

$user = User::get(1);
// 获取user_type获取器数据
echo $user->user_type;
// 获取原始的user_type数据
echo $user->getData(&#39;user_type&#39;);
// 获取全部原始数据
dump($user->getData());

动态获取器

前面我们提到过动态获取器的概念,动态获取器就是不需要在模型类里面定义获取器方法,而是在查询的时候使用闭包来定义一个字段的获取器对数据进行统一的处理。

User::withAttr(&#39;name&#39;, function($value, $data) {
return strtolower($value);
})->select();

如果你需要定义多个动态获取器,多次调用withAttr方法就行。

动态获取器的意义除了可以不用在模型里面定义获取器方法之外,还可以起到覆盖已经定义的获取器的作用,并且动态获取器可以支持Db类操作,弥补了Db操作不能使用获取器的缺憾,具体就看自己的需求来选择了。

Db::name(&#39;user&#39;)->withAttr(&#39;name&#39;, function($value, $data) {
return strtolower($value);
})->select();

总结

无论是获取器,还是之前提的修改器、搜索器,其作用无非是把你的模型工作细化和拆分,这样代码和逻辑也会更清晰,可维护性也大大增强,至于性能,从来不是模型首先考虑的。

PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!

本文转自:https://blog.thinkphp.cn/825350

以上がThinkPHP: モデル用の 3 つの強力なツール (ゲッター) のうちの 3 番目の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はThinkPHP官网で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
thinkphp是不是国产框架thinkphp是不是国产框架Sep 26, 2022 pm 05:11 PM

thinkphp是国产框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。

一起聊聊thinkphp6使用think-queue实现普通队列和延迟队列一起聊聊thinkphp6使用think-queue实现普通队列和延迟队列Apr 20, 2022 pm 01:07 PM

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了关于使用think-queue来实现普通队列和延迟队列的相关内容,think-queue是thinkphp官方提供的一个消息队列服务,下面一起来看一下,希望对大家有帮助。

thinkphp的mvc分别指什么thinkphp的mvc分别指什么Jun 21, 2022 am 11:11 AM

thinkphp基于的mvc分别是指:1、m是model的缩写,表示模型,用于数据处理;2、v是view的缩写,表示视图,由View类和模板文件组成;3、c是controller的缩写,表示控制器,用于逻辑处理。mvc设计模式是一种编程思想,是一种将应用程序的逻辑层和表现层进行分离的方法。

实例详解thinkphp6使用jwt认证实例详解thinkphp6使用jwt认证Jun 24, 2022 pm 12:57 PM

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了使用jwt认证的问题,下面一起来看一下,希望对大家有帮助。

thinkphp扩展插件有哪些thinkphp扩展插件有哪些Jun 13, 2022 pm 05:45 PM

thinkphp扩展有:1、think-migration,是一种数据库迁移工具;2、think-orm,是一种ORM类库扩展;3、think-oracle,是一种Oracle驱动扩展;4、think-mongo,一种MongoDb扩展;5、think-soar,一种SQL语句优化扩展;6、porter,一种数据库管理工具;7、tp-jwt-auth,一个jwt身份验证扩展包。

thinkphp 怎么查询库是否存在thinkphp 怎么查询库是否存在Dec 05, 2022 am 09:40 AM

thinkphp查询库是否存在的方法:1、打开相应的tp文件;2、通过“ $isTable=db()->query('SHOW TABLES LIKE '."'".$data['table_name']."'");if($isTable){...}else{...}”方式验证表是否存在即可。

一文教你ThinkPHP使用think-queue实现redis消息队列一文教你ThinkPHP使用think-queue实现redis消息队列Jun 28, 2022 pm 03:33 PM

本篇文章给大家带来了关于ThinkPHP的相关知识,其中主要整理了使用think-queue实现redis消息队列的相关问题,下面一起来看一下,希望对大家有帮助。

thinkphp3.2怎么关闭调试模式thinkphp3.2怎么关闭调试模式Apr 25, 2022 am 10:13 AM

在thinkphp3.2中,可以利用define关闭调试模式,该标签用于变量和常量的定义,将入口文件中定义调试模式设为FALSE即可,语法为“define('APP_DEBUG', false);”;开启调试模式将参数值设置为true即可。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。