zjkiza / sql-twig-bundle
此组件可以执行原始SQL查询,同时支持嵌入Twig扩展,允许使用Twig语法动态创建查询。
v0.7.1
2024-09-08 20:24 UTC
Requires
- php: >=8.1
- doctrine/dbal: ^2.0|^3.0|^4.0
- symfony/config: ^4.0|^5.0|^6.0|^7.0
- symfony/dependency-injection: ^4.0|^5.0|^6.0|^7.0
- symfony/http-kernel: ^4.0|^5.0|^6.0|^7.0
- symfony/twig-bundle: ^4.0|^5.0|^6.0|^7.0
- twig/twig: ^2.0|^3.0
Requires (Dev)
- dama/doctrine-test-bundle: ^8.0
- doctrine/doctrine-bundle: ^2.12
- doctrine/doctrine-fixtures-bundle: ^3.5
- ekino/phpstan-banned-code: ^1.0
- friendsofphp/php-cs-fixer: ^3.52
- matthiasnoback/symfony-dependency-injection-test: ^5.1
- pdepend/pdepend: ^2.16
- phploc/phploc: ^7.0
- phpmd/phpmd: ^2.15
- phpstan/phpstan: ^1.10
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-symfony: ^1.3
- phpunit/phpunit: ^9.6
- psalm/plugin-phpunit: ^0.19.0
- ramsey/uuid-doctrine: ^2.0
- rector/rector: ^1.0
- symfony/framework-bundle: ^7.0
- symfony/phpunit-bridge: ^6.0
- symfony/property-info: ^7.0
- vimeo/psalm: ^5.6.0
README
此组件可以执行原始SQL查询,同时支持嵌入Twig扩展,允许使用Twig语法动态创建查询。
关于此组件
- 创建查询时可以使用Twig语法。
- 将查询放置在单独的文件中。(例如:all_media.sql.twig)。
- 使用
Zjk\SqlTwig\Contract\SqlTwigInterface
服务执行您的查询。 - 执行结果
Zjk\SqlTwig\Contract\SqlTwigInterface->executeQuery(..)
是 Doctrine\DBAL\Driver\Result 的实例,可以使用其方法来获取结果。 - 通过事务执行查询
Zjk\SqlTwig\Contract\SqlTwigInterface->transaction(..)
安装
将 "zjkiza/sql-twig-bundle" 添加到您的 composer.json 文件中
composer require zjkiza/sql-twig-bundle
Symfony 集成
组件将所有类连接在一起,并提供简单设置的方法。
-
在您的配置中注册组件(例如:
bundles.php
)。<?php declare(strict_types=1); return [ // other bundles Zjk\SqlTwig\ZJKizaSqlTwigBundle::class => ['all' => true], ];
使用组件
必须定义哪个目录/目录将被用于存储包含SQL查询的文件。
twig: paths: '%kernel.project_dir%/src/sql/media': 'media' '%kernel.project_dir%/src/sql/expert': 'expert'
创建一个SQL查询。示例(all_media.sql.twig
)
SELECT m.id {% if true == user %} , u.name as user_name {% endif %} FROM media as m {% if true == user %} INNER JOIN user as u ON m.user_id = u.id {% endif %} WHERE m.id in (:ids) ORDER BY m.id
在PHP中工作,示例
namespace App\Example; use Zjk\SqlTwig\Contract\SqlTwigInterface; class MyRepository { private SqlTwigInterface $sqlTwig; public function __construct(SqlTwigInterface $sqlTwig) { $this->sqlTwig = $sqlTwig; } public function allMedia(): array { return $this->sqlTwig->executeQuery('@media/all_media.sql.twig', [ 'user' => true, 'ids' => ['60b16643-d5e0-468a-8823-499fcf07684a', '60b16643-d5e0-468a-8823-499fcf07684b'], ],[ 'ids' => ArrayParameterType::STRING, ])->fetchAllAssociative() } public function withTransaction(): array { $result = $this->manager->transaction( static fn (SqlTwigInterface $manager): Result => $manager->executeQuery('@query/media_id_title.sql.twig'), TransactionIsolationLevel::READ_UNCOMMITTED ); return $result->fetchAllAssociative(); } }