wepesi / orm
为 PHP 应用程序构建的简单 ORM
Requires
- php: ^7.4||^8.0
- wepesi/optionsresolver: ^0.2.0
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-23 12:57:44 UTC
README
轻量级且简单的 对象关系映射
或 ORM
。
概述
仅支持 MySQL,并使用 PHP 数据对象
或 PDO
开发,但不支持 CLI 或迁移。您应在 php.ini 中激活 PDO
扩展;设计时使用预处理语句。预处理语句可防止 SQL 注入,对于 Web 应用程序的安全性非常重要。
配置
为了与数据库交互,您应提供所有必要的信息。要创建实例,您应提供数据库配置,如 host
、db_name
、username
和 password
,您可以通过调用 getInstance
方法来获取单例实例,并将数组配置作为参数传递。
use Wepesi\App\DB; $config=[ "host"=>"localhost", "db_name"=>"wepesi_db", "username"=>"root", "password"=>"" ]; $db = DB::getInstance($config);
现在您有了数据库连接的单例。
集成
该模块提供了一些方法,以帮助构建
select
=>get
insert
=>insert
update
=>update
delete
=>delete
- 和
transaction
。
get
方法对应于SELECT
,它有助于请求数据库,它有几个链式方法来帮助使请求更有趣。
use Wepesi\App\DB; $config = [ "host" => "localhost", "db_name" => "wepesi_db", "username" => "root", "password" => ""]; $db = DB::getInstance($config); $req = $db->get('message')->result();
- 在
get
方法中,我们有一个第一个参数,即table_name
,然后我们调用result()
方法来执行您的query
并获取结果。相应的 SQL 是
SELECT * FROM message;
如果您想选择特定的字段并应用条件。
$req = $db->get("message")->field(['userid','message'])->where(['userid',"=",1])->result(); var_dump($req);
相应的 SQL
SELECT userid,message FROM message WHERE userid=1
- 使用
field
方法来精确指定您想要获取的字段,所有参数都应通过一个简单的数组传递, - 使用
where
方法在请求中添加条件。要使用where
方法,有一些规则需要遵循。传递数组参数。- 第一个位置是字段名称的字符串,
- 第二个位置是操作
'<', '<=', '>', '>=', '<>', '!=', 'like'
,这仅支持条件,对于更复杂的条件,最好编写一个 [*查询](sql request
)。 - 第三个位置是条件的值,
- 第四个位置是操作符
and
、or
和not
,默认为and
,当存在多个条件时是必需的。
$where = [ ['id',"=",2], ['username',"like",'admin','or'], ['email',"like",'admin'] ]; $db->get("message")->field(['fname','lname'])->where($where)->result();
SELECT fname,lname FROM message WHERE id=1 AND username like 'admin' or email like 'admin';
这还不止这些,您还可以使用 LIMIT
、OFFSET
、groupBY
、orderBy
、ASC
和 DESC
。
$where=[ ['age',">",20] ]; $db->get("users")->field(['email','address'])->where($where)->orderBy("id")->offset(0)->limit(30)->DESC()->result();
注意
如果出现错误,可以调用 error
方法来检查是否存在错误。
$result = $db->get("users")->field(['email','address'])->orderBy("id")->offset(0)->limit(30)->DESC()->result(); if($db->error()) print_r($db->error());
有时您想计算记录数而不是列出它们,count
方法是 get 的一部分,返回一个对象计数。使用计数对象来访问返回的值。
$count_users = $db->count("users")->field(['email','address'])->where($where)->result(); echo $count_users->count; //
insert
用于记录数据。该方法将表名作为参数,使用field
方法传递要保存的数据。如果您的信息是正确的,您可以在db
实例上调用lastId
方法来获取插入记录的 ID。
$data = [ "userid" => 2, "message" => "hello from wepesi", "date_created" => Date('Y-m-d H:i:s') ]; try { $db->insert("message")->field($data)->result(); if ($this->db->error()) { throw new \Exception($this->db->error()); } var_dump($this->db->lastId()); } catch (\Exception $ex) { echo $ex->getMessage(); }
相应的 SQL 看起来像
INSERT INTO message (`userid`,`message`,`datecreated`) VALUES (?,?,?)
- 当您需要删除记录时,请使用
delete
。此模块与在get
方法中编写的条件相同,但仅支持删除。当操作成功时,它将返回一个数组array("delete" => true)
。
try { $req = $db->delete("message")->where(["id","=",16])->result(); if ($this->db->error()) { throw new \Exception($this->db->error()); } return $req; } catch (\Exception $ex) { echo $ex->getMessage(); }
相应的 SQL
DELETE `message` WHERE `id`='16'
update
当您需要更新一条记录时,请使用此模块。与在delete
方法中编写 where 条件的方式相同,仅支持删除。调用rowCount
方法以获取更新的记录数。您应该调用field
方法来指定要更新的字段。
try { $field = ["text" => "new messages from now"]; $db->update("message")->field($field)->where(["id","=",16])->result(); if ($this->db->error()) { throw new \Exception($this->db->error()); } return $db->rowCount(); } catch (\Exception $ex) { echo $ex->getMessage(); }
相应的 SQL
update `message`set text=? WHERE `id`='16'
query
:如果您有复杂的查询,则可以使用它。
try{ $req = $this->db->query("select * from message join users on users.id=message.userid"); if($req->error()){ throw new \Exception($req->error()); } return $req->result(); }catch(\Exception $ex){ echo $ex->getMessage(); }
下面的示例说明了如何使用它。使用 query
方法,使用 result()
方法获取结果。
事务
出于许多原因,如果您的一个操作失败,您可能希望实现一个事务。请注意,只有 InnoDB
支持事务,为了看到结果,您应该确保您的 ENGINE
是 InnoDB。如果您不确定数据库引擎,可以使用 convertMyISAMToInnoDB
方法转换您的表。该方法将帮助将 MyISAM
引擎转换为 InnoDB
。有两种使用事务的方式,您可以根据自己的方式管理事务的启动和结束,或者使用内置的 transaction
方法。建议使用 try-catch 来完成操作。
事务有三个方法用于正确工作,我们有
beginTransaction
:此方法用于开始一个事务,应该放置在事务将发生操作的开始处。commit
:在操作成功时使用此方法。rollBack
:用于取消所有操作。
try{ $user = [ "fullname" => "Celestin Doe", "username" => "JohnDoe", "password" => md5("12345678"), "datecreated" => Date("Y-m-d H:i:s",time()) ]; $message = [ "message" => "Hello Celestin", 'datecreated' => Date('Y-m-d H:i:s', time()) ]; $db->beginTransaction(); $db->insert('users')->field($user)->result(); if ($db->error()) { throw new \Exception($db->error()); } $user_id = $db->lastId(); $user['id'] = $user_id; $message['user_id'] = $user_id; $db->insert('message')->field($message)->result(); if ($db->error()) { throw new \Exception($db->error()); } $message['id'] = $db->lastId(); $user['messages'] = $message; print_r($user); $db->commit(); } catch(\Exception $ex){ $db->rollBack(); }
方法支持将闭包方法作为参数传递。
您不需要管理事务的每个情况,该方法帮助您关注实现,并将为您完成工作。
$user = [ "fullname" => "Celestin Doe", "username" => "John Doe", "password" => md5("12345678"), "datecreated" => Date("Y-m-d H:i:s",time()) ]; $message = [ "message" => "Hello Celestin", 'datecreated' => Date('Y-m-d H:i:s', time()) ]; try { $db->transaction(function($db) use ($user,$message){ $db->insert('users')->field($user)->result(); if ($db->error()) { throw new \Exception($db->error()); } $user_id = $db->lastId(); $user['id'] = $user_id; $message['user_id'] = $user_id; $db->insert('message')->field($message)->result(); if ($db->error()) { throw new \Exception($db->error()); } $message['id'] = $db->lastId(); $user['messages'] = $message; print_r($user); }); } catch (\Exception $ex) { var_dump($ex); }
- 希望您喜欢。ORM 没有连接方法或包含方法,如果要执行此操作,则最好使用 *QUERY 方法。