kappa / deaw
Dibi 使用的轻量级包装器,以便更好地工作
Requires
- php: >= 5.4.0
- dibi/dibi: >2.0
- nette/di: ^2.2
- nette/utils: ^2.2
Requires (Dev)
- mockery/mockery: ~0.9
- nette/nette: ^2.2
- nette/tester: ~1.4
This package is auto-updated.
Last update: 2024-09-04 18:59:12 UTC
README
轻量级包装器,以便更好地使用 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