wepesi/orm

为 PHP 应用程序构建的简单 ORM

v1.0.0 2023-07-27 13:11 UTC

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 应用程序的安全性非常重要。

配置

为了与数据库交互,您应提供所有必要的信息。要创建实例,您应提供数据库配置,如 hostdb_nameusernamepassword,您可以通过调用 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)。
    • 第三个位置是条件的值,
    • 第四个位置是操作符 andornot,默认为 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'; 

这还不止这些,您还可以使用 LIMITOFFSETgroupBYorderByASCDESC

    $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 来完成操作。

  • pdo 事务

事务有三个方法用于正确工作,我们有

  • 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 方法。