wscore / dbaccess
使用简单的DAO进行数据库访问管理。
Requires
- aura/sql: 5.*
- psr/log: ~1.0
- wscore/scoresql: 0.2.*
Requires (Dev)
- monolog/monolog: 1.x
This package is auto-updated.
Last update: 2024-09-26 10:05:52 UTC
README
简单的数据库访问管理器和数据访问对象类。
此软件包提供对以下内容的快速访问:
- AuraPHP/Sql软件包中的ExtendedPdo和ConnectionPools,
- 使用ScoreSql进行的流畅查询组合,以及
- 简单的Dao(数据库访问对象)。
许可证
MIT许可证
示例用法
配置
使用静态DB类作为数据库管理器(DbAccess类)的网关(也称为外观)。
使用DB::config()方法配置数据库连接。
DB::config( [ 'dsn' => 'mysql:host=localhost;dbname=name;charset=utf', 'user' => 'username', 'pass' => 'password', 'option' => [], 'attribute' => [] ] );
有关每个配置的详细信息,请参阅Aura/Sql组件。
在配置中指定for以连接到用于读取和写入的不同数据库。
DB::config( [ 'dsn' => '...', ] ); DB::config( [ 'dsn' => '...', 'for' => 'write', ] );
获取连接(即Pdo)
获取数据库连接的Pdo对象。Aura/Sql中的ExtendedPdo被返回。
$pdo = DB::connect(); $pdo2 = DB::connectWrite();
如果未设置写入连接,则返回读取连接。
获取命名连接
使用名称配置不同的数据库连接。
DB::config( 'log', [ 'dsn' => 'mysql',... ] ); // then get PDO as: $pdo = DB::connect( 'log' );
查询数据库
使用DB::query()获取查询对象以访问数据库。请参阅ScoreSql以了解如何操作查询。
$result = DB::query( 'myTable' ) ->connect( 'conn' ) ->where( DB::given( 'status' )->is( 5 ) ) ->select();
如果使用默认连接,则可能省略connect()。
实体对象
默认情况下,Dao对象将找到的数据库记录作为EntityObject类返回。此类具有对Dao对象的引用,在保持代码库最小尺寸的同时提供许多有用的功能。
一些功能包括:
- 将值转换为对象(或反之)。
- 以属性或数组的形式访问数据。
- 找到修改后的数据。
- 获取主键。
- 获取关系对象。
ActiveRecord
Dao可以返回ActiveRecord类的对象,如下所示:
class YourDao extends Dao { protected $fetch_class = 'WScore\ScoreDB\Entity\ActiveRecord'; }
ActiveRecord类将提供比上述EntityObject更多功能,例如:
- 保存到数据库。
- 从数据库中删除自身。
- 免疫对数据库的访问。
数据访问对象
示例Dao类
扩展Dao类。
/** * @method User status( $status=1 ) */ class User extends Dao { protected $table = 'dao_user'; protected $keyName = 'user_id'; protected $timeStamps = [ 'created_at' => [ 'created_at', 'open_date' => 'Y-m-d' ], 'updated_at' => [ 'updated_at' ], ]; /** * @param int $status */ public function scopeActive() { $this->where( $this->status->is( 1 ) ); } }
表名和主键
将表名指定为class::$table,主键名称指定为class::$keyName。
如果没有设置,则使用类名作为表名,使用tableName_id作为键名。
时间戳
使用class::$timeStamps来指示戳记:创建数据时的created_at,更新和创建时间时的updated_at。
如果不同,则指定日期格式
使用DaoTrait
作为替代,可以使用DaoTrait使用其他查询类创建Dao对象。如下所示:
class Other extends OtherQuery { user DaoTrait; }
访问数据库
使用$dao对象就像在WScore.SqlBuilder中的查询对象一样。
选择
// list all users with status=1. $found = $user->where( $user->status->is(1) )->select();
或使用$dao对象作为迭代器。
$users = User::forge(); foreach( $users as $user ) { echo $user->name; }
更新
// update active people to status=2. $user->active()->update('status'=>2);
或
$user->status = 2; $user->active()->update();
插入
$user->insert( [ 'name' => 'bob', 'status'=>0 ] );
或
$user->name = 'bob'; $user->status = 0; $user->insert();
Dao中的范围和事件
范围
范围是以scope开头的函数。在范围函数中,影响查询以获取所需的内容。
$user = User::forge(); // use $dao as iterator. foreach( $user->active() as $applied ) { echo $applied->name; }
钩子
钩子方法以on开头,事件名称,以Hook结尾。
class User extends public function on{EventName}Hook( $data ) { } }
过滤器
过滤器方法以on开头,事件名称,以Filter结尾。
过滤器用于修改输入或输出;请务必确保过滤器返回给定(或修改后的值)或不会发生任何事情。
class User extends public function on{EventName}Filter( $data ) { return $data; } }
钩子对象
Dao类可能因为大量的作用域和事件钩子而变得很大。为了简化Dao类,可以使用setHook()方法将这些方法转移到另一个对象(钩子对象)中,例如
// $hookObject has the events and scopes. $user->setHook( $hookObject );
可用的事件
每次访问数据库时,以~ing开头,后面跟~ed。
- 选择,已选择,
- 加载,已加载,
- 计数,已计数,
- 插入,已插入,
- 更新,已更新,
- 删除,已删除,
隐藏(或已使用)的事件
- createStamp, updateStamp
在插入或更新数据时添加时间戳。
关系
ScoreDB提供了简单的关联类,如
- HasOne,
- HasMany,和
- HasJoin。
使用关系
在你的Dao类中,创建如下方法
class YourDao extends Dao { public function getTargetsRelation() { return Relation::HasOne( $this, 'TargetDaoName' ); } } $dao = new YourDao(); $entity = $dao->find($id); // get target record using HasOne relation. $targets = $dao->getTargetsRelation()->entity( $entity )->get(); // or use EntityObject's magic method. $targets = $entity->targets->get();
来设置新的关系
$entity->targets->link( $targetEntity );
WISHES WISHES WISHES
事务
对于事务,使用Pdo(ExtendedPdo)的事务方法。
DB::db()->transaction( function() { // do database access. } );