ThinkPHP01: データベースとモデル
1. デバッグモードをオンにする
- ルート ディレクトリには
.example.env
ファイルが付属します。デバッグ モードを有効にするには、これを削除します.example
。 - 始まる
.env
_APP_DEBUG = true
- デバッグ モードでは、小さなトレース デバッグ アイコンがページの右下隅に表示されます。
2. 設定ファイル
- 構成ファイルには、ローカル開発およびテスト用の構成ファイルと、展開およびオンライン展開用の構成ファイルの 2 つの形式があります
.env
。 - ローカルでテストする場合は、
.env
よりも優先されますconfig
。デプロイメントがオンラインになると、.env
自動的に無視されます。 - 構成を取得します。
public function config() { echo "env配置:" . env("database.hostname"); echo "<br>"; echo "config配置:" . config("database.connections.mysql.hostname"); }
3. URL 解析
- ThinkPHP のデフォルトはシングル アプリケーション モードです。
class Test {
// 控制器默认操作, http://localhost:8000/test
public function index() {
return "index";
}
// http://localhost:8000/test/hello
public function hello() {
return "hello";
}
// http://localhost:8000/test/hello1?value=world
public function hello1($value = "") {
return "hello, ". $value;
}
}
- デフォルトのコントローラーファイルディレクトリを変更し、config の下のroute.php で設定します。
4. データベース
- テーブル全体をクエリします。プレフィックスがある場合は name("member") を使用します。
use think\facade\Db;
class DataTest {
public function index() {
$dbs = Db::table('member')->select();
return json($dbs);
}
}
- 単一データ クエリの場合、データがない場合は find() が null を返し、データがない場合は findOrFail() が例外をスローし、データがない場合は findOrEmpty() が空の配列を返します。
public function index2() {
// 查询id为1
$dbs = Db::table('member')->where('id',1)->find();
// 查看sql语句
return Db::getLastSql();
return json($dbs);
}
- データ セット クエリ、select() はすべてのデータを返し、selectOrFail() はデータがない場合に例外をスローし、toArray() は select() の後のデータ セットをブラシ グループに変換します。
- その他のクエリの場合、value() は特定のフィールドを返し、column() は特定のフィールドの複数の値を返します。データ量が多すぎる場合は、chunk() を使用してデータをバッチ処理するか、カーソル クエリ カーソルを使用します。 ()。
- 同じオブジェクト インスタンスの 2 番目のクエリでは、最初のクエリの値が保持されます。前のクエリで保持された値をクリアするには、removeOption() を使用します。
- 新しいデータを追加するには、insert() を使用して、影響を受ける行の数を返します。存在しないフィールド データを追加すると、例外がスローされます。存在しないフィールドを強制的に追加する場合は、stick(false) を使用して、 insertGetId() で挿入された ID を取得し、insertAll () で複数のデータを挿入し、replace() で replace into を実装し、save() で追加か変更かを決定します。
public function index3() {
$data = [
"name" => "k",
"age" => 12,
"email" => "@@@"
];
return $this->memberTable->insert($data);
}
- データを変更するには、update() を使用し、変更中に関数操作を実行するには exp() を使用し、フィールドをインクリメントおよびデクリメントするには inc()/dec() を使用し、以前のすべての操作を実行するには raw() を使用します。
- データを削除するには、delete() を使用します。これはデフォルトで主キーに基づいて削除されます。
- クエリ式には、where()、whereLike()、whereBetween()、whereIn()、および whereNull() が含まれます。
- 時間クエリには、where()、whereBetween()、whereBetweenTime()、whereTime()、where Year()、whereMonth()、whereDay()、および whereBetweenTimeField() が含まれます。
- 集計クエリ、count()、max()、min()、avg()、sum()。サブクエリ、fetchSql()、buildSql()、クロージャ。ネイティブ クエリ、query()、execute()。
- 链式查询,where()、whereRaw()、field()、fieldRaw()、withoutField()、alias()、limit()、page()、order()、orderRaw()、group()、having( )。
- クイック クエリ、whereColumn()、whereXXX() XXX はフィールド名、getByXXX()、getFieldByXXX()、when()、withAttr() を表します。
- トランザクション処理、transaction()、rollback()。
5.モデル
1. モデルを定義する
- データベース内のメンバー テーブルに対応する定義構文。キャメル ケースで名前が付けられます。
use think\Model; class Member extends Model { }
- モデル内にモデル名を指定したい場合。
use think\Model; class MemberModel extends Model { protected $name = 'member'; }
- デフォルトの主キーは id です。主キーを積極的に設定してください
use think\Model; class MemberModel extends Model { protected $pk = 'uid'; }
- デフォルトではクラス名とテーブル名が対応しており、テーブルは自動的に設定されます。
use think\Model; class MemberModel extends Model { protected $table= 'member'; }
- モデルの初期化。自動的に呼び出されます。
use think\Model; class MemberModel extends Model { protected static function init(){ parent::init(); } }
2. モデルを使用する
-
モデルをコントローラーに導入する
use \app\model\Member as MemberModel;
① レコードのクエリ
- Db ファサードのクエリ機能はモデルによってサポートされています。
- すべての記録
use \app\model\Member as MemberModel; class Member { public function index() { $member = MemberModel::select(); $member = MemberModel::find(1); return $member; } }
- シングルレコード
public function index() { $member = MemberModel::find(1); return $member; }
② 新規レコードを追加
-
通常の新規追加
public function insert() { // 新增方式1 $member = new MemberModel(); $member->name = "李白"; $member->age = 18; $member->email = "@"; $member->save(); // 新增方式2 $member = new MemberModel(); $member->save([ 'name' => "李黑", 'age' => 19, 'email' => "@" ]); }
-
新しい追加を確認し、書き込みを許可するフィールドを設定します。
$member->allowField(['name', 'age'])->save([ 'name' => "李黑", 'age' => 19, 'email' => "@" ]);
-
新しいものと交換する
$member->replace()->save();
-
追加が成功したら、自己追加したIDを取得します。
$member->id;
-
バッチで追加
$member = new MemberModel(); $dataAll = [ [ 'name' => "黑李", 'age' => 22, 'email' => "@" ], [ 'name' => "白李", 'age' => 24, 'email' => "@" ], ]; dump($member->saveAll($dataAll));
-
create(新增数组, 允许写入的字段, 是否replace)
追加するデータを作成するには静的メソッドを使用します。$member = MemberModel::create([ 'name' => "白李", 'age' => 24, 'email' => "@" ], ['name', 'age'], true); echo $member->id;
③ 記録を削除する
-
単一の項目を削除すると、デフォルトでは主キーに基づいて削除されます。
public function delete() { // 成员方法删除 $member = MemberModel::find(1); $member->delete(); // 静态方法删除 MemberModel::destroy(2); }
-
一括削除
MemberModel::destroy([3, 4, 5]);
-
クロージャによる削除
MemberModel::destroy(function ($query){ $query->where("age", "<", 10); });
④ 記録を更新する
-
通常のアップデート
public function update() { $member = MemberModel::find(8); $member->name = "李四"; $member->age = 120; $member->save(); }
-
アップデートさせる
$member->force()->save();
-
Db::raw()
SQL関数の実行$member->age = Db::raw("age + 1");
-
allowField()
更新されたフィールドを制限します (生のフィールドは制限できません)。 -
saveAll()
バッチ更新では、主キーに基づいてのみ更新し、変更されたデータ セットを返すことができます。 -
静的メソッド
update(数据数组, 限定记录, 限定字段)
MemberModel::update([ 'name' => "占山", 'age' => 15 ], ['id' => 10], ['name']);
3. フィールドの設定
-
モデルのデータ フィールドはテーブル フィールドに対応しており、デフォルトでは大文字と小文字が厳密に区別されます。
class Member extends Model { // 是否严格区分大小写 protected $strict = false; // 设置字段 protected $schema = [ "id" => 'int', 'name' => "string", "age" => "int", "email" => "string" ]; }
-
$schema 属性はモデルに対してのみ有効です。Db クラスを有効にする必要がある場合は、config/database.php でフィールド キャッシュを有効にします。
'fields_cache' => true,
-
モデル内のプロセスデータ
class Member extends Model { public function getMemberName($id) { $data = $this->find($id); return $data->getAttr('name'); } }
4.モデルゲッター
-
ゲッターはモデル内の特別なメソッドに対応し、メソッドは public であり、メソッド名の形式は固定されています
getXxxAttr()
。 -
ゲッターの機能は、モデル インスタンスのデータを自動的に処理することです。
class Member extends Model { // 获取器,获取数据时自动执行 public function getAgeAttr($value) { if ($value < 18) { return "未成年"; }else{ return "已成年"; } } }
-
ゲッターが定義されており、元の値を取得する必要がある場合は、それを使用します
getData()
。 -
動的ゲッター
withAttr()
public function index6() { $var = MemberModel::select()->withAttr("email", function ($value) { return strtoupper($value); }); return json($var); }
5. モデル修飾子
-
修飾子の機能は、データの追加または変更時にデータの書式設定とフィルタリングを行うことです。メソッド名の形式は固定です
setXxxAttr()
。 -
修飾子はモデル操作に対してのみ有効であり、Db クラスに対しては有効ではありません。
class Member extends Model { public function setEmailAttr($value) { return strtoupper($value); } }
6. モデルクエリのスコープ
-
コントローラー呼び出しを容易にするために、モデルにクエリまたは書き込みメソッドをカプセル化します。メソッド名の形式
scopeXxx
。class Member extends Model { public function scopeAdult($query) { $query->where("age", ">=", 18) ->field("id, name, age") ->limit(3); } }
-
呼び出しにはサフィックスのみが必要で、クエリ範囲では検索と選択のみがサポートされます。
use \app\model\Member as MemberModel; class Member { public function index7() { $select = MemberModel::adult()->select(); return json($select); } }
-
グローバル クエリ スコープ。どのクエリでもこのスコープを追加する必要があります。
class Member extends Model { // 定义全局查询范围 protected $globalScope = ['status']; public function scopeStatus($query) { $query->where("status", 1); } }
7. モデルデータセット
- データセットはコレクション クラスから継承します。
- フィールドの非表示
hidden()
、フィールドの表示visible()
、ゲッター フィールドの追加append()
、フィールド上での関数処理の実行を行いますwithAttr()
。
8. モデルの自動タイムスタンプ
-
自動タイムスタンプは、create_time フィールドと update_time フィールドに自動的に書き込まれます。デフォルト値は int です。
-
自動タイムスタンプをグローバルに有効にし、config/database.php で設定します。
'auto_timestamp' => true,
-
モデルを有効に設定するだけの場合は、モデルに設定します。
protected $autoWriteTimestamp = true;
-
新しいタイムスタンプと変更されたタイムスタンプをカスタマイズする
protected $createTime = "create_at"; protected $updateTime = "update_at";
-
update_time は必要ありません
protected $updateTime = false;
9. モデルの読み取り専用フィールド
-
読み取り専用フィールドはモデルのみをサポートし、データベース メソッドはサポートしません。
-
読み取り専用フィールドは、変更中は変更できません。
protected $readonly = ['name','email'];
-
読み取り専用フィールドを動的に設定します。
$member->readonly(['name','email'])->save();
10. モデルの種類と変換
-
型変換では、プロパティやその他の操作でゲッターが呼び出されます。
-
型変換を設定すると、データを取得する前に必要な型に変換できます。
protected $type = [ 'name' => 'string', 'price' => 'float', "create_time" => "datetime:Y-m-d" ];
-
フィールドが使用されなくなった場合は、破棄フィールドとして設定できます。
protected $disuse = ['status', 'uid'];
11. モデルのソフト削除
-
論理的な削除はレコードを物理的に削除せず、グローバル クエリ スコープと同等です。
-
モデルに論理的な削除機能を設定します。
use think\model\concern\SoftDelete; class Member extends Model { use SoftDelete; protected $deleteTime = "delete_time"; }
-
論理的な削除のブロックを解除する
UserModel::withTrashed()->select();
-
論理的に削除されたレコードを表示する
UserModel::onlyTrashed()->select();
-
論理的な削除を元に戻す
restore()
$user = UserModel::onlyTrashed()->find(300); $user->restore();
-
物理的な除去
UserModel::onlyTrashed()->find(298)->force()->delete();
6. アソシエーションモデル
1. アソシエーションモデルの定義
-
アソシエーションモデルとは、テーブル同士を関連付けて可視化し、データをより効率的に操作するモデルです。
-
メインテーブルは付録 (前方関連付け)、
hasOne(附表模型, 外键, 主键)
1 対 1 関連付けに関連付けられており、外部キーのデフォルトは です主表名_id
。class profile extends Model { } class Member extends Model { public function profile() { return $this->hasOne(Profile::class); } }
-
付録表は主表と関連付けられており(逆関連付け)、
belongsTo()
class Profile extends Model { public function member() { return $this->belongsTo(Member::class, "user_id"); } }
-
コールモデル
use app\model\Member as MemberModel; class Grade { public function index() { $member = MemberModel::find(1); return $member->profile->hobby; } }
-
関連する方法
関数 説明する ある 1対1 属する 1対1 多くを持っています 1対多の ワンスルーあり リモート1対1 たくさんある リモートの 1 対多 多くの人に属しています 多対多 モーフメニー ポリモーフィックな 1 対多 モーフへ ポリモーフィズム -
正の相関と負の相関
説明する 正の相関 逆連想 1対1 ある 属する 1対多の 多くを持っています 属する 多対多 多くの人に属しています 多くの人に属しています リモートの 1 対多 たくさんある \ ポリモーフィックな 1 対 1 モーフワン モーフへ ポリモーフィックな 1 対多 モーフメニー モーフへ
2. 1 対 1 の関連クエリ
-
1 対 1 の関連付けの変更
$member = MemberModel::find(1); $member ->profile->save(['hobby' => '吃饭']);
-
1対1の関連付けが追加されました
$member = MemberModel::find(1); $member ->profile()->save(['hobby' => '吃饭']);
-
順方向関連付けと逆方向の操作
$member = MemberModel::hasWhere("prefile", ["id" => 2])->find();
3. 1 対多の関連クエリ
-
has()
関連する付録のメインテーブルの内容をクエリするメソッド。MemberModel::has("profile", ">=", 2)->select();
-
together()
主表の内容を削除する際に、付録表に関連付けられている内容も同時に削除できます。$member = MemberModel::with('profile')->find(2); $member->together(['profile'])->delete();
-
新規追加は、新規の 1 対 1 関連付けと同じです。
4. 関連するプリロード
-
相関プリロードによりクエリの数が減り、パフォーマンスが向上しますが、複数の呼び出しはサポートされていません。
$list = MemberModel::with(['profile'])->select([19, 20, 21]); foreach ($list as $member) { dump($member->profile); }
-
メインテーブルが複数のサブテーブルに関連付けられている場合。
$list = MemberModel::with(['profile', 'book'])->select([19, 20, 21]); foreach ($list as $member) { dump($member->profile.$member->book); }
-
遅延プリロード
$list = MemberModel::select([19, 20, 21]); $list->load(['profile']); foreach ($list as $member) { dump($member->profile); }
5. 相関統計と出力
-
withMax、withMin、withCount、withAvg など、メイン テーブルにアタッチされたテーブルに含まれるレコードの数をカウントします。
public function index3() { $list = MemberModel::withCount(['profile'])->select([1,2,3]); foreach ($list as $member) { echo $member->profile_count . '<br>'; } }
-
相関統計出力を採用
关联方法_统计方法
。 -
hidden
visible
追加のフィールドを追加して、非表示フィールドと表示フィールドを制御しますappend
。$list = MemberModel::withCount(['profile'])->select([1,2,3]); $list->hidden(['password', 'gender', 'profile.status']);
6. 多対多のリレーショナル クエリ
-
多対多の中間テーブル モデル クラス Pivot。
-
モデルクラスで多対多の関連付けを設定します。
belongsToMany(关联模型, 中间表, 外键, 关联键)
public function roles(){ return $this->belongsToMany(Role::class, Access::class); }
-
使用
// 获取用户 $member = MemberModel::find(2); // 获取用户权限 $roles = $member->roles;
-
追加するには、ユーザーテーブルを介して中間テーブルに追加する必要があります。
$member = MemberModel::find(2); $member->roles->save(Role::find(5)); $member->roles->saveAll([1, 2, 3]); $member->roles->attach(5, ["detail" => "测试"]);
-
中間テーブルデータの削除
$member = MemberModel::find(2); $member->detach(5);
7. JSONを操作する
1. データベース JSON
-
配列モードを使用してデータベースに JSON を書き込みます。指定された JSON フィールドを使用します
json()
。public function insert(){ $data = [ "name" => "张三", "list" => ["nikeName" => "zs", "gender" => "女"] ]; return Db::name("user")->json(["list"])->insert($data); }
-
データのクエリにはJSONの変換と設定が必要です
json()
Db::name('user')->json(["list"])->find(15);
-
JSONフィールドを変更する
$data["list"] = ["nikeName" => "zs", "gender" => "女"]; Db::name("user")->json(['list']->where('id', 1)->update($data); $data["list->gender"] = "男"; Db::name("user")->json(["lsit"])->where('id', 1)->update($data);
2. JSON のモデル化
-
モデルに JSON フィールドを設定する
protected $json = ["list"];
-
モデル内の JSON を介したデータ クエリ
UserModel::where('list->name', "小红")->find();
-
データを更新する
$user = UserModel::find(1); $user->list->name = "小黑"; $user->save();
8. イベント
- 追加、削除、変更、クエリを実行すると、何かがトリガーされて追加の操作が実行されることがあります。
1. データベースイベント
- データベース イベントは、検索、選択、更新、削除、挿入のみをサポートします。
- データベースの練習方法は、
Db::event('事件名', '执行函数')
イベント名 | 説明する |
---|---|
before_select | 選択クエリの前のコールバック |
before_find | 検索クエリの前のコールバック |
挿入後 | 挿入操作が成功した後のコールバック |
更新後 | 更新操作が成功した後のコールバック |
削除後 | Dalete 操作が成功した後のコールバック |
-
コントローラー側では、イベントは通常、初期化メソッド (BaseController から継承) に書き込まれます。
use app\BaseController; use think\facade\Db; class Member extends BaseController { public function initialize() { Db::event("before_select", function ($query) { echo "执行了批量查询"; }); Db::event("after_update", function ($query) { echo "修改被执行"; }); } }
2. モデルイベント
- モデルがサポートするイベント タイプはさらに豊富です。
class Member extends Model {
protected static function onAfterRead($query){
echo "一条数据被查询";
}
protected static function onBeforeUpdate(Model $model) {
parent::onBeforeUpdate($model); // TODO: Change the autogenerated stub
}
}