个性化阅读
专注于IT技术分析

如何在Symfony 3中使用Doctrine执行纯SQL

DQL作为一种查询语言, 具有SELECT, UPDATE和DELETE构造, 它们映射到其相应的SQL语句类型。

但是, 在DQL中有很多语句(例如插入)是不允许的(或它们不存在), 因为必须通过EntityManager将实体及其关系引入持久性上下文中, 以确保对象模型的一致性。

基本上, 如果你想使用普通sql将信息插入数据库中, 则会将模型丢到垃圾桶中……但是, 如果你有非常复杂的查询, 而无法使用普通sql的功能, 那么使用普通sql的功能就派上用场了。使用DQL可以实现的原因有很多(很难或没有可用的自定义函数扩展等)。

在本文中, 你将学习如何使用Symfony 3中的学说轻松地执行纯SQL查询。

用法

为了执行原始sql查询, 我们需要使用主义连接来访问数据库。你可以从实体管理器中检索默认连接。

以下示例显示如何从Symfony控制器使用简单的sql查询:

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $RAW_QUERY = 'SELECT * FROM my_table where my_table.field = 1 LIMIT 5;';
        
        $statement = $em->getConnection()->prepare($RAW_QUERY);
        $statement->execute();

        $result = $statement->fetchAll();
    }
}

$ result变量应包含一个包含5行数据库的关联数组。

绑定参数

与主义的查询构建器一样, 可以使用语句中的bindValue方法为查询设置参数, 以使查询更加动态。

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $RAW_QUERY = 'SELECT * FROM my_table where my_table.field = :status LIMIT 5;';
        
        $statement = $em->getConnection()->prepare($RAW_QUERY);
        // Set parameters 
        $statement->bindValue('status', 1);
        $statement->execute();

        $result = $statement->fetchAll();
    }
}

多个数据库

当你使用多个数据库时, 自然会有不止一名经理。如前所述, 只需获取针对你要查询的数据库的实体管理器的连接即可。

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        // Get connections
        $DatabaseEm1 = $this->getDoctrine()->getManager('database_or_connection_name1');
        $DatabaseEm2 = $this->getDoctrine()->getManager('database_or_connection_name2');

        // Write your raw SQL
        $rawQuery1 = 'SELECT * FROM my_table where my_table.field = :status LIMIT 10;';
        $rawQuery2 = 'SELECT * FROM my_table where my_table.field = :text LIMIT 5;';

        // Prepare the query from DATABASE1
        $statementDB1 = $DatabaseEm1->getConnection()->prepare($rawQuery1);
        $statementDB1->bindValue('status', 1);

        // Prepare the query from DATABASE2
        $statementDB2 = $DatabaseEm2->getConnection()->prepare($rawQuery2);
        $statementDB2->bindValue('text', 'Hello World');

        // Execute both queries
        $statementDB1->execute();
        $statementDB2->execute();

        // Get results :)
        $resultDatabase1 = $statementDB1->fetchAll();
        $resultDatabase2 = $statementDB2->fetchAll();
    }
}

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 3中使用Doctrine执行纯SQL

评论 抢沙发

评论前必须登录!