voku/simple-active-record

1.8.0 2020-04-11 00:00 UTC

README

Build Status Coverage Status Codacy Badge Latest Stable Version Total Downloads License Donate to this project using Paypal Donate to this project using Patreon

💍 简单活动记录

这是一个与PHP 7+兼容的简单活动记录模式,它通过💎 "Simple MySQLi" 在核心提供简单且安全的数据库交互。这对于小规模应用如定时任务、Facebook Canvas活动或微型框架或网站非常合适。

获取“简单活动记录”

您可以从这里下载,或使用 composer 安装。

  {
      "require": {
        "voku/simple-active-record": "1.*"
      }
  }

通过“composer require”安装

  composer require voku/simple-active-record

启动驱动程序

  use voku\db\DB;

  require_once 'composer/autoload.php';

  $db = DB::getInstance('yourDbHost', 'yourDbUser', 'yourDbPassword', 'yourDbName');
  
  // example
  // $db = DB::getInstance('localhost', 'root', '', 'test');

多例 && 单例

您可以使用 DB::getInstance() 不带任何参数,并将得到您的(作为“单例”)首次初始化的连接。或者,您可以更改参数,并将创建一个新的“多例”实例,它像单例一样工作,但您需要再次使用相同的参数,否则(如果没有相同的参数)您将得到一个新的实例。

作为父驱动程序的Doctrine/DBAL

  use voku\db\DB;

  require_once 'composer/autoload.php';
  
  $connectionParams = [
      'dbname'   => 'yourDbName',
      'user'     => 'yourDbUser',
      'password' => 'yourDbPassword',
      'host'     => 'yourDbHost',
      'driver'   => 'mysqli', // 'pdo_mysql' || 'mysqli'
      'charset'  => 'utf8mb4',
  ];
  $config = new \Doctrine\DBAL\Configuration();
  $doctrineConnection = \Doctrine\DBAL\DriverManager::getConnection(
      $connectionParams,
      $config
  );
  $doctrineConnection->connect();

  $db = DB::getInstanceDoctrineHelper($doctrineConnection);

使用“ActiveRecord”类(面向对象数据库访问)

通过Arrayy实现的活动记录模式的简单示例。

setDb(DB $db)

设置数据库连接。

  $db = DB::getInstance('YOUR_MYSQL_SERVER', 'YOUR_MYSQL_USER', 'YOUR_MYSQL_PW', 'YOUR_DATABASE');
  ActiveRecord::setDb($db);

insert() : bool|int

此函数可以构建插入SQL查询,并将当前记录插入到数据库中。如果插入成功,它将返回新ID,否则它将返回false或true(如果没有脏数据)。

  $user = new User();
  $user->name = 'demo';
  $user->password = password_hash('demo', PASSWORD_BCRYPT, ["cost" => 15]);
  $user_id = $user->insert();
  
  var_dump($user_id); // the new id 
  var_dump($user->id); // also the new id 
  var_dump($user->getPrimaryKey()); // also the new id 

fetch(integer $id = null) : bool|\ActiveRecord

此函数可以获取一个记录并将其分配给当前对象。如果您用 $id 参数调用此函数,它将使用当前主键名称获取记录。

  $user = new User();

  $user->notnull('id')->orderBy('id desc')->fetch();
  
  // OR //
  
  $user->fetch(1);
  
  // OR //
  
  $user->fetchById(1); // thows "FetchingException" if the ID did not exists
  
  // OR //
  
  $user->fetchByIdIfExists(1); // return NULL if the ID did not exists
  
    
  // OR //
  
  $user->fetchByHashId('fsfsdwldasdar'); // thows "FetchingException" if the ID did not exists
  
  // OR //
  
  $user->fetchByHashIdIfExists('fsfsdwldasdar'); // return NULL if the ID did not exists
  
  var_dump($user->id); // (int) 1
  var_dump($user->getPrimaryKey()); // (int) 1

fetchAll() : $this[]

此函数可以获取数据库中的所有记录,并将返回ActiveRecord对象数组。

  $user = new User();

  $users = $user->fetchAll();
  
  // OR //
  
  $users = $user->fetchByIds([1]);
  
  // OR //
  
  $users = $user->fetchByIdsPrimaryKeyAsArrayIndex([1]);
    
  var_dump($users[0]->id) // (int) 1
  var_dump($users[0]->getPrimaryKey()); // (int) 1

update() : bool|int

此函数可以构建更新SQL查询,并可以更新数据库中的当前记录,只需将脏数据写入数据库。如果更新成功,它将返回受影响的行数作为int,否则它将返回false或true(如果没有脏数据)。

  $user = new User();
  $user->notnull('id')->orderBy('id desc')->fetch();
  $user->email = 'test@example.com';
  $user->update();

delete() : bool

此函数可以删除数据库中的当前记录。

活动记录 | SQL部分函数

select()

此函数可以设置选择列。

  $user = new User();
  $user->select('id', 'name')->fetch();

from()

此函数可以设置从表中获取记录。

  $user = new User();
  $user->select('id', 'name')->from('user')->fetch();

join()

此函数可以设置从表中获取记录。

  $user = new User();
  $user->join('contact', 'contact.user_id = user.id')->fetch();

where()

此函数可以设置WHERE条件。

  $user = new User();
  $user->where('id=1 AND name="demo"')->fetch();

groupBy()

此函数可以设置“分组”条件。

  $user = new User();
  $user->select('count(1) as count')->groupBy('name')->fetchAll();

orderBy()

此函数可以设置“排序”条件。

  $user = new User();
  $user->orderBy('name DESC')->fetch();

limit()

此函数可以设置“限制”条件。

  $user = new User();
  $user->orderBy('name DESC')->limit(0, 1)->fetch();

活动记录 | WHERE条件

equal()/eq()

  $user = new User();
  $user->eq('id', 1)->fetch();

notEqual()/ne()

  $user = new User();
  $user->ne('id', 1)->fetch();

greaterThan()/gt()

  $user = new User();
  $user->gt('id', 1)->fetch();

lessThan()/lt()

  $user = new User();
  $user->lt('id', 1)->fetch();

greaterThanOrEqual()/ge()/gte()

  $user = new User();
  $user->ge('id', 1)->fetch();

lessThanOrEqual()/le()/lte()

  $user = new User();
  $user->le('id', 1)->fetch();

like()

  $user = new User();
  $user->like('name', 'de')->fetch();

in()

  $user = new User();
  $user->in('id', [1, 2])->fetch();

notIn()

  $user = new User();
  $user->notin('id', [1, 3])->fetch();

isNull()

  $user = new User();
  $user->isnull('id')->fetch();

isNotNull()/notNull()

  $user = new User();
  $user->isNotNull('id')->fetch();

活动记录 | 示例

包含 && 初始化

use voku\db\DB;
use voku\db\ActiveRecord;

require_once 'composer/autoload.php';

$db = DB::getInstance('YOUR_MYSQL_SERVER', 'YOUR_MYSQL_USER', 'YOUR_MYSQL_PW', 'YOUR_DATABASE');
ActiveRecord::setDb($db);

定义类

namespace demo;

use voku\db\ActiveRecord;

/**
 * @property int       $id
 * @property string    $name
 * @property string    $password
 * @property Contact[] $contacts
 * @property Contact   $contacts_with_backref
 * @property Contact   $contact
 */
class User extends ActiveRecord {
  public $table = 'user';

  public $primaryKey = 'id';
  
  protected function init()
  {
      $this->addRelation(
          'contacts',
          self::HAS_MANY,
          FoobarContact::class,
          'user_id'
      );

      $this->addRelation(
          'contacts_with_backref',
          self::HAS_MANY,
          FoobarContact::class,
          'user_id',
          null,
          'user'
      );

      $this->addRelation(
        'contact',
          self::HAS_ONE,
          FoobarContact::class,
          'user_id',
          [
              self::SQL_WHERE => '1 = 1',
              self::SQL_ORDER => 'id desc',
          ]
      );
  }
}

/**
 * @property int    $id
 * @property int    $user_id
 * @property string $email
 * @property string $address
 * @property User   $user_with_backref
 * @property User   $user
 */
class Contact extends ActiveRecord {
  public $table = 'contact';

  public $primaryKey = 'id';
  
  protected function init()
  {
      $this->addRelation(
          'user_with_backref',
          self::BELONGS_TO,
          FoobarUser::class,
          'user_id',
          null,
          'contact'
      );

      $this->addRelation(
          'user',
          self::BELONGS_TO,
          FoobarUser::class,
          'user_id'
      );
  }
}

初始化数据(对于测试 - 请使用迁移执行此步骤)

CREATE TABLE IF NOT EXISTS user (
  id INTEGER PRIMARY KEY, 
  name TEXT, 
  password TEXT 
);

CREATE TABLE IF NOT EXISTS contact (
  id INTEGER PRIMARY KEY, 
  user_id INTEGER, 
  email TEXT,
  address TEXT
);

将一个用户插入到数据库中。

use demo\User;

$user = new User();
$user->name = 'demo';
$user->password = password_hash('demo', PASSWORD_BCRYPT, ["cost" => 15]);
$user_id = $user->insert();

var_dump($user_id); // the new id 
var_dump($user->id); // also the new id 
var_dump($user->getPrimaryKey()); // also the new id 

将一个属于当前用户的联系人插入到数据库中。

use demo\Contact;

$contact = new Contact();
$contact->address = 'test';
$contact->email = 'test1234456@domain.com';
$contact->user_id = $user->id;

var_dump($contact->insert()); // the new id 
var_dump($contact->id); // also the new id 
var_dump($contact->getPrimaryKey()); // also the new id 

使用关系的示例

use demo\User;
use demo\Contact;

$user = new User();

// fetch one user
var_dump($user->notnull('id')->orderBy('id desc')->fetch());

echo "\nContact of User # {$user->id}\n";
// get contacts by using relation:
//   'contacts' => [self::HAS_MANY, 'demo\Contact', 'user_id'],
var_dump($user->contacts);

$contact = new Contact();

// fetch one contact
var_dump($contact->fetch());

// get user by using relation:
//    'user' => [self::BELONGS_TO, 'demo\User', 'user_id'],
var_dump($contact->user);

变更日志

CHANGELOG.md

支持

如需支持和捐赠,请访问 GitHub | 问题 | PayPal | Patreon

如需状态更新和发布公告,请访问 发布 | Twitter | Patreon

如需专业支持,请联系

感谢

  • 感谢 GitHub(微软)提供代码托管和良好的基础设施,包括问题管理等。
  • 感谢 IntelliJ,它们提供了最佳的PHP IDE,并授予我PhpStorm的开源许可证!
  • 感谢 Travis CI,它是最出色、最简单的持续集成工具!
  • 感谢 StyleCI 提供简单但强大的代码风格检查。
  • 感谢 PHPStanPsalm 提供真正优秀的静态分析工具,并帮助发现代码中的错误!