kappa / deaw

Dibi 使用的轻量级包装器,以便更好地工作

v1.0.0 2016-12-28 15:27 UTC

This package is auto-updated.

Last update: 2024-09-04 18:59:12 UTC


README

Build Status

轻量级包装器,以便更好地使用 dibi

内容

要求

可以从 Composer 配置文件 获取到的依赖项完整列表

安装

安装 Kappa\Deaw 的最佳方式是使用 Composer

$ composer require kappa/deaw:@dev

在您第一次使用之前,您必须已经注册了具有所需设置的 dibi

extensions:
  dibi: Dibi\Bridges\Nette\DibiExtension22
  
dibi:
  host: 127.0.0.1
  username: root
  password: 
  database: test
  driver: mysql

当您已注册 dibi 时,可以添加 Kappa\Deaw 扩展,无需任何额外配置(所有配置将从 dibi 包中使用)。

extensions:
   dibi: Dibi\Bridges\Nette\DibiExtension22
   - \Kappa\Deaw\DI\DeawExtension
   
 dibi:
   host: 127.0.0.1
   username: root
   password: 
   database: test
   driver: mysql

如何使用

该包的基本原则是结合 领域查询(cz)dibi 方式。该包提供查询对象,可用于获取或执行查询,并分布到自定义类中。

使用此包非常简单。 Kappa\Deaw 提供了一个基类 Kappa\Deaw\DataAccess,用于使 dibi 的工作更加舒适。使用此类,您可以执行所有获取、执行操作,并可以处理事务。

首先,您可以将其注入到您的模型中

class Users {
    
    private $dataAccess;
    
    public function __construct(\Kappa\Deaw\DataAccess $dataAccess) {
        $this->dataAccess = $dataAccess;
    }
}

准备基本获取查询对象,该对象必须实现 \Kappa\Deaw\Query\Queryable 接口,或者对于简单的查询对象,您可以使用抽象类 \Kappa\Deaw\Query\QueryObject

class FetchAdminUsers extends QueryObject { // or implments Queryable 
    public function doQuery(QueryBuilder $builder) {
        return $builder->createQuery()->select('*')
            ->from('user')
            ->where('role = ?', 'admin');
    }
}

现在我们可以将其结合到模型中

class Users {
    
    private $dataAccess;
    
    public function __construct(\Kappa\Deaw\DataAccess $dataAccess) {
        $this->dataAccess = $dataAccess;
    }
    
    public function getAdmins() {
        return $this->dataAccess->fetch(new FetchAdminUsers());
    }
}

就是这样!

获取

基本获取原则已在上面解释。您可以使用三种方法获取数据。

  • fetch - 获取所有记录(替代 dibi 中的 fetchAll
  • fetchOne - 获取单个记录(替代 dibi 中的 fetch
  • fetchSingle - 获取单个值(替代 dibi 中的 fetchSingle

执行

您还可以运行可执行查询对象来插入、更新或删除数据。例如

class AddNewAdminUser extends QueryObject
{
    private $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function doQuery(QueryBuilder $builder) {
        $builder->createQuery()->insert('users', [
            'name' => $this->name,
            'role' => 'admin'
        ]);
    }
}

和模型

class Users {
    
    private $dataAccess;
    
    public function __construct(\Kappa\Deaw\DataAccess $dataAccess) {
        $this->dataAccess = $dataAccess;
    }
    
    public function addAdmin($name) {
        return $this->dataAccess->execute(new AddNewAdminUser($name));
    }
}

事务

此外,您还可以使用非常简单的典型 dibi 事务包装器。

我们使用之前示例中的 AddNewAdminUser 查询对象为例

class Users {
    
    private $dataAccess;
    
    public function __construct(\Kappa\Deaw\DataAccess $dataAccess) {
        $this->dataAccess = $dataAccess;
    }
    
    public function addAdmins() {
        $transaction = $this->dataAccess->createTransaction();
        try {
            $this->dataAccess->execute(new AddNewAdminUser('foo'));
            $this->dataAccess->execute(new AddNewAdminUser('bar'));
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollback();
        }
    }
}

当然,您可以使用保存点(如果支持)作为嵌套事务

class Users {
    
    private $dataAccess;
    
    public function __construct(\Kappa\Deaw\DataAccess $dataAccess) {
        $this->dataAccess = $dataAccess;
    }
    
    public function addAdmins() {
        $transaction = $this->dataAccess->createTransaction();
        try {
            $this->dataAccess->execute(new AddNewAdminUser('foo'));
            $this->dataAccess->execute(new AddNewAdminUser('bar'));
            $nestedTransactions = $this->dataAccess->createTransaction();
            try {
                $this->dataAccess->execute(new AddNewAdminUser('foo_bar'));
                $nestedTransactions->commit(); // savepoint release is not required
            } catch (\Exception $e) {
                $nestedTransactions->rollback();
            }  
            $transaction->commit();
        } catch (\Exception $e) {
            $transaction->rollback();       
        }      
    }
}

查询对象

基本查询对象提供 postFetch 方法,该方法在每次获取后调用。此方法可以用于在返回之前解析数据或其他操作...

提示:此方法可以用于将字符串表示的从多到一关系解析为数组,例如

SQL

CREATE TABLE `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `title` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

INSERT INTO `articles` (`id`, `user_id`, `title`) VALUES
(1,	1,	'Foo_article_1'),
(2,	1,	'Foo_article_2'),
(3,	2,	'Bar_article_1'),
(4,	2,	'Bar_article_2');

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

INSERT INTO `users` (`id`, `name`) VALUES
(1,	'Foo'),
(2,	'Bar');
class FetchToMany implements Queryable {
    public function doQuery(QueryBuilder $builder) {
        return $builder->createQuery()
            ->select('users.id, users.name, GROUP_CONCAT(articles.title SEPARATOR ',') as articles')
            ->leftJoin('articles')->on('articles.user_id = users.id')
            ->from('users');
    }
    
    public function postFetch($data) {
        foreach ($data as $key => $row) {
            $data[$key]['articles'] = explode(',', $data[$key]['articles'];
        }
        
        return $data;
    }
}

结果将是

    [
        [
            'id' => '1',
            'name' => 'Foo',
            'articles' => [
                'Foo_article_1',
                'Foo_article_2'
            ]
        ],
        [
            'id' => '2',
            'name' => 'Bar',
            'articles' => [
                'Bar_article_1',
                'Bar_article_2'
            ]
        ]
    ]

开发

测试

当您可以运行测试时,您必须创建自己的配置文件。请复制文件 tests/config/config.sample.neon,将其重命名为 config.neon(删除 sample 字词)并在该文件中更新凭据。同样处理 tests/config/database.sample.ini

现在您可以通过以下命令运行测试 ./vendor/bin/tests -c ./tests/php-unix.ini ./tests