zjkiza/sql-twig-bundle

此组件可以执行原始SQL查询,同时支持嵌入Twig扩展,允许使用Twig语法动态创建查询。

安装: 2

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

v0.7.1 2024-09-08 20:24 UTC

This package is auto-updated.

Last update: 2024-09-08 20:28:05 UTC


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 集成

组件将所有类连接在一起,并提供简单设置的方法。

  1. 在您的配置中注册组件(例如: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();
    }
        
}