【如何在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();
}}
玩得开心 !
推荐阅读
- 如何使用C#下载Web文件并同步和异步显示下载进度
- 如何在PHP中编写具有ANSI编码的文本文件(Western Windows-1252)
- Unirest PHP SSL证书问题(无法获取本地颁发者证书)
- Crud可捕获的致命错误(Entity\MyClass类的对象无法转换为字符串Symfony 3)
- 在Symfony 2和3中实现Disqus评论
- 如何使用Potrace CLI对图片中的签名进行数字化和矢量化
- 如何在Linux和Windows环境中使用PHP执行Shell命令而无需等待结果(异步)
- 如何在没有Imagick的情况下在PHP中调整图像大小并降低质量
- 如何在CSS中使用超赞的字体如医学图标