kolaykod / simpledb
针对PHP的PDO类定制
Requires
- php: >=8.0.0
This package is not auto-updated.
Last update: 2024-09-19 22:35:25 UTC
README
PHP的PDO类
安装和使用
$ composer require kolaykod/simpledb
示例用法
$db = new \kolaykod\simpledb([ 'database' => 'ecommerce', 'username' => 'root' 'password' => 'test', 'prefix' =>'prefix', 'charset' => 'utf8' ]);
对于SQLite的使用
$db = new \kolaykod\simpledb([ 'driver' => 'sqlite', 'database' => 'ecommerce.sqlite' ]);
不使用Composer
通过创建一个新目录,并将src目录下的所有文件复制到其中,然后使用require将autoload.php文件包含到页面中启动类。
require '{pdb_dosyalarinin_bulundugu_dizin}/autoload.php'; $db = new \kolaykod\simpledb([ 'database' => 'ecommerce', 'username' => 'root', 'password' => 'test', 'charset' => 'utf8' ]);
配置
默认配置设置
[
'host' => 'localhost',
'driver' => 'mysql',
'database' => '',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'debug' => false,
'cacheTime' => 60,
'cachePath' => __DIR__ . '/Cache'
]
目前可用的驱动程序列表
- Mysql
- Sqlite(测试阶段)
获取
获取
结果默认以 Object 格式返回。如果您想以 Array 格式访问,请查看 toArray() 方法。
$products = $db->get('products'); foreach ($products as $product) { echo $product->name; }
get()get('products')
可用的方法: get()、first()、value()、pluck()、find()
$products = $db->select('id, name, code, slug, price, stock') ->table('products') ->where('stock > ?', 5) ->where('MONTH(created) = MONTH(NOW())') ->order('id') ->get();
上述查询的输出如下
SELECT id, name, code, slug, price, stock FROM products WHERE stock > ? AND MONTH(created) = MONTH(NOW()) ORDER BY id DESC
toArray()
用于以 Array 格式访问结果。
$products = $db->table('products') ->toArray() ->get(); foreach ($products as $product) { echo $product['name']; }
toJson()
用于以 Json 格式访问结果。
$products = $db->table('products') ->toJson() ->get();
First
如果您需要从一个表中获取单行数据,可以使用 first() 方法。该方法默认返回一个stdClass对象。
$user = $db->table('users') ->first(); echo $user->email;
Value
如果您不需要一行数据,可以使用value方法从一个记录中提取单个值。
$email = $db->table('users') ->where('name', 'Walter') ->value('email'); echo $email;
Pluck
如果您需要包含单个列值的数组,可以使用 pluck() 方法。
$pluck = $db->table('products') ->pluck('name');
Array
(
[0] => Apple Iphone X 128 GB
[1] => Apple Iphone X 256 GB
[2] => Apple Iphone X 512 GB
)
通过向 pluck() 方法发送第二个参数,您可以指定要使用作为数组的键的列。
$pluck = $db->table('products') ->pluck('name', 'code');
Array
(
[APPLEX128] => Apple Iphone X 128 GB
[APPLEX256] => Apple Iphone X 256 GB
[APPLEX512] => Apple Iphone X 512 GB
)
Find
返回与主键匹配的记录。
$user = $db->table('users') ->find(15);
SELECT * FROM users WHERE id=?
find(15)find(15, 'products')
Total
用于获取总行数。
$total = $db->table('users') ->where('userGroup', 'Admin') ->total();
total()total('users')
rowCount()
用于获取受影响的行数或读取的行数。
echo $db->rowCount();
lastInsertId()
在插入操作中返回最后插入行的主键。
echo $db->lastInsertId();
原始查询
用于执行原始SQL查询。
原始获取
$results = $db->raw('SELECT id FROM products WHERE active = ? AND MONTH(created) = MONTH(NOW())', 1) ->getCols();
原始执行
$update = $db->raw('UPDATE payments SET active = !active WHERE status = ?', ['paid']) ->exec();
分页
应发送每页要显示的记录数作为参数。 pager() 方法仅在原始查询中工作。
$posts = $db->table('posts') ->pager(25) ->get();
pager() 函数接受2个参数。第一个参数是每页要显示的记录数,第二个参数是要将页面信息传递到 $_GET 参数的。例如,链接结构为 ?page=3,则示例用法如下;
$db->pager(25, 'sayfa');
pagerLinks()
用于获取链接的输出。
echo $db->pagerLinks();
«‹123456...›»
pagerData()
用于获取总结果、页面数、限制、偏移和活动页面等信息。
var_dump($db->pagerData());
Array
(
[count] => 255
[limit] => 10
[offset] => 0
[total] => 26
[current] => 1
)
setPagerTemplate()
用于调整链接输出的HTML模板。
$db->setPagerTemplate('<li> <a class="{active}" href="{url}"> {text} </a> </li>');
缓存
用于将结果缓存在内存中。对于很少更改且使用频率高的查询,可以使用此方法来提高性能。
磁盘缓存
从mysql中读取comments表中的数据并将其写入磁盘。结果将在30秒内从磁盘读取。
$results = $db->cache(30)->get('comments');
fromDisk() 方法;如果最后查询是从磁盘读取的,则返回 true,如果是从mysql读取的,则返回 false。
Redis缓存
从mysql中读取comments表中的数据并将其写入redis数据库。结果将在30秒内通过Redis读取。
$results = $db->redis(30)->get('comments');
fromRedis() 方法;如果最后查询是从Redis读取的,则返回 true,如果是从mysql读取的,则返回 false。
$redisConnect = (function(){ $redis = new \Redis(); $redis->connect('127.0.0.1', 6379, 1, NULL, 0, 0, ['auth' => ['default', '']]); return $redis; }); $db->setRedis($redisConnect());
使用 setRedis() 方法可以外部包含Redis类。
注意:要使用Redis进行缓存,您的服务器上必须安装Redis。
插入
用于向表中添加新行。可以使用 insert() 方法添加单个或多个记录。
单条记录
$db->table('products')->insert([ 'name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9' ]);
多记录
$db->table('products')->insert([ ['name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9'], ['name' => 'Apple Iphone X 256 Gb', 'code' => 'APPLEX256', 'price' => '1149.9'], ['name' => 'Apple Iphone X 512 Gb', 'code' => 'APPLEX512', 'price' => '1349.9'] ]);
要获取最后插入行的主键,可以使用 lastInsertId() 方法,要获取受影响的总行数,可以使用 rowCount() 方法。
Upsert
$db->table('products')->upsert([ 'name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9' ]);
如果找到匹配的唯一键,则更新现有记录,如果没有找到,则添加新记录。
- 目前不支持Sqlite。
Insert Ignore
$db->table('products')->insertIgnore([ 'name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9' ]);
如果找到匹配的唯一键,则不会添加记录,如果没有找到,则添加新记录。
Insert Replace
$db->table('products')->insertReplace([ 'name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9' ]);
如果找到匹配的唯一键,则删除现有记录并添加新记录,如果没有找到,则添加新记录。每次替换操作中,由 auto_increment 指定的主键值(通常是ID)也会改变。如果想要保留该值,建议使用 upsert() 方法。
Update
用于更新一个或多个记录。
$update = $db->table('products') ->where('id', 11255) ->update(['active' => 1]);
- 返回受影响的行数。
Touch
如果 active 列的值为 1,则变为 0,如果为 0,则变为 1。
$touch = $db->table('products') ->touch('active');
touch('active', 'products')
Increment
将 hit 列增加 1 或发送的值。
$increment = $db->table('posts') ->where('slug', 'whats-new-in-laravel-8') ->increment('hit');
increment('hit')increment('hit', 5)
Decrement
将 hit 列减少 1 或发送的值。
$increment = $db->table('posts') ->where('slug', 'whats-new-in-laravel-8') ->decrement('hit');
decrement('hit')decrement('hit', 5)
Delete
用于删除一个或多个记录。
$delete = $db->in('id', [321, 412, 324, 142]) ->delete('products');
- 返回受影响的行数。
Filter
比较发送的值与表中的列,并自动清理错误或多余的数据。可以与 insert()、insertIgnore()、insertReplace()、upsert()、update() 方法一起使用。
假设我们有一个名为 users 的表,它由上面的列组成。
$db->table('users')->filter()->insert([ 'username' => 'walterbishop', 'email' => 'walter@bishop.com', 'password' => 'U7!hsjlIus', 'gender' => 'Male', 'fullname' => 'Walter Bishop' ]);
- 由于
filter()方法在users表中找不到fullname列,因此它会自动清理这些数据,确保无错误地创建记录。
$db->table('users')->filter()->insert($_POST);
- 以下是一个使用
$_POST发送表单的示例。
Validate
该方法目前仅用于过滤发送的值,用默认值填充空字段,进行非空和枚举检查。
try{ $db->table('users')->validate()->insert([ 'username' => 'walterbishop', 'email' => 'walter@bishop.com', 'password' => 'U7!hsjlIus', 'gender' => 'Elephant' ]); } catch(Exception $e){ echo $e->getMessage(); }
- 由于
gender列中未定义枚举值Elephant,因此会返回错误,不会添加记录。
事务
方法:inTransaction()、beginTransaction()、commit()、rollBack()
try { $db->beginTransaction(); $db->table('products')->insert([ 'name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9' ]); $db->table('images')->insert([ 'productId' => $db->lastInsertId(), 'imageName' => 'foo.jpg' ]); $db->commit(); } catch(Exception $e) { $db->rollBack(); }
Select
$db->select('id, name, code, price')...
select('id, name')select(['id', 'name', ...])
如果没有使用该方法,则默认使用
*选择所有列。
Select Functions
方法:count()、sum()、avg()、min()、max()
$db->sum('amount')...
sum('amount')sum('amount', 'totalAmount')
Table
table() 和 from() 方法具有相同的功能。
$db->table('products')...
table('products')table(['products as p', 'images as i'])
Join
方法:leftJoin()、rightJoin()、innerJoin()、leftOuterJoin()、rightOuterJoin()、fullOuterJoin()
$db->table('products as p') ->leftJoin('images as i', 'p.id', 'i.productId') ->get();
leftJoin('images', 'products.id', 'images.productId')leftJoin('images', 'products.id = images.productId')leftJoin('images ON products.id = images.productId')
Where
方法:where()、orWhere()、notWhere()、orNotWhere()
$db->where('id', 32886)...
where('active', 1)where('stock >= ? AND active = ?', [2, 1])where(['stock > ?', 'active > ?'], [2, 1])where(['stock' => 2, 'active' => 1])where('stock >= 2 AND active = 1 AND MONTH(updated) = MONTH(NOW())')
Group Where
$db->table('products') ->like('name', '%iphone%') ->grouped(function($q){ $q->in('brandId', [1, 2, 3])->orIn('categoryId', [1, 2, 3]); })->get();
SELECT * FROM products WHERE name LIKE ? AND (brandId IN(?,?,?) OR categoryId IN(?,?,?))
Between
方法:between()、orBetween()、notBetween()、orNotBetween()
$db->between('price', 50, 250)...
Is Null - Not Null
方法:isNull()、orIsNull()、notNull()、orNotNull()
$db->isNull('code')...
isNull('slug')isNull(['slug', ...])
In - Not In
方法:in()、orIn()、notIn()、orNotIn()
$db->in('id', [33922, 31221, 45344, 35444])...
Find In Set
方法: findInSet(),orFindInSet(),notFindInSet(),orNotFindInSet()
$db->findInSet('categoryId', 139)...
Like - Not Like
方法: like(),orLike(),notLike(),orNotlike()
$db->like('name', '%Apple%')...
排序
默认选择 desc。
$db->order('id')...
order('id')order('id', 'asc')order('id desc, name asc')order('rand()')
分组
$db->group('id')...
group('id')group(['id', 'name'])
Having
$db->having('stock', 5)...
having('stock', 5)having('stock > 5')having('stock > ?', 5)
Limit - Offset
用于Limit,Offset和分页操作。
$db->limit(100)... $db->limit(100, 0)... $db->limit(100)->offset(0)...
历史记录
queryHistory()
用于访问查询列表。
var_dump($db->queryHistory());
Array
(
[0] => Array
(
[query] => SELECT id, name FROM products WHERE code = ? AND active = ? ORDER BY id desc
[params] => Array
(
[0] => 34066
[1] => 1
)
[from] => redis
)
)
lastQuery()
用于显示最后一条查询。
echo $db->lastQuery();
SELECT id, name FROM products WHERE code = ? AND active = ? ORDER BY id desc
lastParams()
用于查看最后一条查询的参数。
var_dump($db->lastParams());
Array
(
[0] => 34066,
[1] => 1
)
queryCount()
用于获取总查询数。
echo $db->queryCount();
1
结构
用于结构化查询。
$db->repair('sessions');
方法: truncate(),drop(),optimize(),analyze(),check(),checksum(),repair()
贡献者
- kolaykod kolaykod