ThinkORM是一個基於PHP和PDO的資料庫中間層和ORM類別庫,以優異的功能和突出的效能著稱,現已經支持獨立使用,並作了升級改進,提供了更優秀的效能和開發體驗,最新版本要求PHP8.0+。
安裝
composer require topthink/think-orm
資料庫 JSON
如果你的
user
表有一個
info
欄位是
JSON
型別的(或者說你儲存的是
JSON
格式,但並非是要
JSON
欄位型別),你可以使用下面的方式運算元據。
JSON 數據寫入
資料庫寫入json欄位,直接透過數據的方式插入即可完成.
$data = [
'id' => 2024,
'username' => 'Tinywan',
'info' => [
'email' => '[email protected]',
'gender' => '女',
'age' => 24
]
];
$res = think\facade\Db::table('user')->json(['info'])->insert($data);
JSON 數據查詢
查詢整個JSON數據
如果要查詢數據時,正確轉換json數據,也需要設定
json
方法
$user = think\facade\Db::table('user')->json(['info'])->find(1);
dump($user);
查詢條件為JSON數據
如果將json欄位數據作為查詢條件,可以透過如下方式實作
$user = think\facade\Db::table('user')
->json(['info'])
->where('info->email','[email protected]')
->find();
dump($user);
由於JSON欄位的內容型別並不會自動獲取,所以,如果是整型數據查詢的話,可以設定JSON欄位型別,例如:
$user = think\facade\Db::name('user')
->json(['info'])
->where('info->user_id', 10)
->setFieldType(['info->user_id' => 'int'])
->find();
dump($user);
JSON 數據更新
完整JSON數據更新
$data['info'] = [
'email' => '[email protected]',
'nickname' => 'Tinywan',
];
think\facade\Db::table('user')
->json(['info'])
->where('id', 2024)
->update($data);
單個JSON數據更新
$data['info->nickname'] = 'Tinywan';
think\facade\Db::name('user')
->json(['info'])
->where('id',1)
->update($data);
模型 JSON
這裏指的JSON數據欄位包括JSON型別以及JSON格式數據(但並不是JSON型別欄位)。
User模型類
<?php
namespaceapp\model;
usethink\Model;
classUserextendsModel
{
// 設定json型別欄位
protected $json = ['info'];
}
定義後,可以進行如下JSON數據操作。
寫入JSON數據
使用陣列方式寫入JSON數據:
$user = new User;
$user->name = 'Tinywan';
$user->info = [
'email' => '[email protected]',
'nickname '=> '阿克蘇',
];
$user->save();
使用物件方式寫入JSON數據
$user = new User;
$user->name = 'Tinywan';
$info = new \Std class();
$info->email = '[email protected]';
$info->nickname = '阿克蘇';
$user->info = $info;
$user->save();
查詢JSON數據
$user = User::find(1);
echo$user->name; // Tinywan
echo$user->info->email; // [email protected]
echo$user->info->nickname; // 阿克蘇
查詢條件為JSON數據
$user = User::where('info->nickname', '阿克蘇')->find();
echo$user->name; // Tinywan
echo$user->info->email; // [email protected]
echo$user->info->nickname; // 阿克蘇
更新JSON數據
$user = User::find(1);
$user->name = 'Tinywan';
$user->info->email = '[email protected]';
$user->info->nickname = 'Tinywan';
$user->save();
如果設定模型的
JSON
數據返回陣列,那麽更新操作需要調整如下。
$user = User::find(1);
$user->name = 'Tinywan';
$info['email'] = '[email protected]';
$info['nickname'] = 'Tinywan';
$user->info = $info;
$user->save();
更多:https://blog.csdn.net/mayidream/article/details/105083871
JSON 物件查詢
rest_day_rule
欄位儲存數據結構如下
{"start_time": "09:00"}
原生SQL查詢
SELECT * FROM attendance_group WHERE rest_day_rule->'$.start_time' = '09:00'
ORM模型查詢
$user = think\facade\Db::table('attendance_group')
->json(['rest_day_rule'])
->where('rest_day_rule->start_time','09:00')
->find();
JSON 陣列查詢
config
欄位儲存數據結構如下
[
{
"shift_id": 1,
"is_checked": 1,
"shift_name": "通用班次",
"shift_time": "09:00-18:00",
"worker_name": "周一"
},
{
"shift_id": 2,
"is_checked": 1,
"shift_name": "通用班次",
"shift_time": "09:00-18:00",
"worker_name": "周二"
}
]
原生SQL查詢
SELECT * FROM attendance_group_time WHERE JSON_CONTAINS(config, JSON_OBJECT('shift_id',1))
ORM模型查詢
$shiftId = 1;
$attendanceGroupTime = AttendanceGroupTimeModel::json(['config'])
->whereRaw('JSON_CONTAINS(config, JSON_OBJECT("shift_id",' . $shiftId . '))')
->findOrEmpty();
AttendanceGroupTimeModel 模型類
classAttendanceGroupTimeModelextendsBaseModel
{
/** 設定當前模型對應的完整數據表名稱 */
protected $table = 'attendance_group_time';
/** 設定當前模型對應的JSON欄位 */
protected $json = ['config'];
}