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

【如何在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(); }}

玩得开心 !

    推荐阅读