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();
}
}
玩得开心 !
评论前必须登录!
注册