wscore/dbaccess

此软件包的最新版本(0.5.0)没有可用的许可证信息。

使用简单的DAO进行数据库访问管理。

0.5.0 2022-02-24 01:24 UTC

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.
} );