voku / simple-active-record
简单活动记录
Requires
- php: >=7.0
- hashids/hashids: ~2.0 || ~3.0 || ~4.0
- voku/arrayy: ~7.0
- voku/simple-mysqli: ~8.0
Requires (Dev)
- doctrine/dbal: ~2.0
- phpunit/phpunit: ~6.0 || ~7.0
This package is auto-updated.
Last update: 2024-09-04 04:15:08 UTC
README
💍 简单活动记录
这是一个与PHP 7+兼容的简单活动记录模式,它通过💎 "Simple MySQLi" 在核心提供简单且安全的数据库交互。这对于小规模应用如定时任务、Facebook Canvas活动或微型框架或网站非常合适。
获取“简单活动记录”
您可以从这里下载,或使用 composer 安装。
{ "require": { "voku/simple-active-record": "1.*" } }
通过“composer require”安装
composer require voku/simple-active-record
- 启动驱动程序
- 多例 && 单例
- 作为父驱动程序的Doctrine/DBAL
- 使用“ActiveRecord”类(面向对象数据库访问)
- 日志和错误
- 变更日志
启动驱动程序
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。
如需专业支持,请联系 我。