ThinkPHP: DB クラスとモデルの正しい使用法

爱喝马黛茶的安东尼
リリース: 2019-12-16 16:40:50
転載
7217 人が閲覧しました

ThinkPHP: DB クラスとモデルの正しい使用法

ThinkPHP5.*、特にバージョン 5.1 を使用する場合、多くの開発者が Db とモデルの正しい使用姿勢を理解していないことが判明しました。以下の正しい姿勢で使用しない場合、罠に陥る可能性が非常に高いです。

Db の正しい姿勢

公式に推奨される Db クラスの使用法 (つまり、毎回静的メソッドを呼び出す)

// 查询单个数据
Db::name('user')->where('id', 1)->find();
// 查询多个数据
Db::name('user')->where('id', '>', 1)->select();
// 写入新的数据
Db::name('user')->insert(['name' => '张三']);
// 更新数据
Db::name('user')->where('id', 1)->update(['name' => '李四']);
// 删除数据
Db::name('user')->delete(1);
ログイン後にコピー

多くの開発者 コードを簡素化するために、読者は次のコードを使用することを好みます。

ただし、5.1 では以下のコードを決して使用しないでください。

// 错误的用法

$user = Db::name('user');
// 查询单个数据
$user->where('id', 1)->find();
// 查询多个数据
$user->where('id', '>', 1)->select();
// 写入新的数据
$user->insert(['name' => '张三']);
// 更新数据
$user->update(['name' => '李四']);
// 删除数据
$user->delete(1);
ログイン後にコピー

ヘルパー関数を使用することも、依然として推奨されません。

// 仍然是错误的用法

// 查询单个数据
db('user')->where('id', 1)->find();
// 查询多个数据
db('user')->where('id', '>', 1)->select();
// 写入新的数据
db('user')->insert(['name' => '张三']);
// 更新数据
db('user')->update(['name' => '李四']);
// 删除数据
db('user')->delete(1);
ログイン後にコピー

多くの開発者は、なぜそれが間違った使い方なのか疑問に思うかもしれません。私が使用した結果は明らかに良好ですよね?これは、あなたがまだ罠にはまっていないことを意味します。

本当の理由は、バージョン 5.1 では各クエリの後に以前のクエリ条件がクリアされないためです (5.0 では毎回クエリ条件がクリアされます)。そのため、次の使用法が有効です。

$user = Db::name('user');
// 查询分数大于80分的用户总数
$count = $user->where('score', '>', 80)->count();
// 查询分数大于80分的用户数据
$user->select();
ログイン後にコピー

これを見ると、同じデータベース クエリ オブジェクト インスタンスを使用する場合、クエリ条件は常に保持される (つまり、後続のクエリ条件が混乱する) ことが理解できるはずです。ヘルパー関数または手動インスタンス化を使用した操作は、以下のように手動でクリアしない限り、同じオブジェクト インスタンスになります。

$user = Db::name('user');
// 查询分数大于80分的用户总数
$count = $user->where('score', '>', 80)->count();
// 清除查询条件(但不包括排序或者字段等信息)
$user->removeOption('where');
// 查询所有用户数据 并按分数倒序排列 
$user->order('score', 'desc')->select();
// 清除所有查询条件
$user->removeOption();
// 查询分数等于100的用户
$user->where('score', 100)->select();
ログイン後にコピー

ベスト プラクティス: 毎回新しい DB 静的クエリを使用する

モデルの正しい姿勢

設計実際、Db と同様に、基本的に手動でインスタンス化する必要はありません。

// 写入新的数据
$user = User::create(['name' => '张三']);
// 更新数据
$user->update(['name' => '李四']);

// 查询单个数据
$user = User::get(1);
// 删除当前模型数据
$user->delete();
ログイン後にコピー

上記のコードでは、インスタンス化コードを使用せず、静的メソッドの操作を使用します。モデルのインスタンス化は、データのクエリまたは書き込み時にシステムによって自動的に完了します。モデルを手動でインスタンス化すると、モデルのインスタンス化を繰り返すコストが発生します。

推奨されない使用法:

$user = new User;
// 写入新的数据
$user->name = '张三';
$user->save();
ログイン後にコピー
$user = new User;
$user->find(1);
echo $user->name;
ログイン後にコピー

推奨される使用法:

// 写入新的数据
User::create(['name' => '张三']);
$user = User::get(1);
echo $user->name;
ログイン後にコピー

したがって、モデルを手動でインスタンス化しないでください。また、モデル ヘルパー関数の使用も推奨されません。

ベスト プラクティス: モデルのクエリと作成の両方に静的メソッドを使用する

さて、Db クラスとモデルを使用するための正しい姿勢を理解できましたか?

PHP 中国語 Web サイトには、無料の ThinkPHP 入門チュートリアル が多数あり、誰でも学習することができます。

この記事は https://blog.thinkphp.cn/810719

から転載しています。

以上がThinkPHP: DB クラスとモデルの正しい使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:thinkphp.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!