Answers:
这是我正在做的Doctrine 2中的原始查询的示例:
public function getAuthoritativeSportsRecords()
{
$sql = "
SELECT name,
event_type,
sport_type,
level
FROM vnn_sport
";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
...getConnection()->query($sql);
而且不必跑步$stmt->execute();
EntityManagerInterface $entityManager
,然后致电$entityManager->getConnection()
假设您正在使用PDO,我可以通过执行此操作来使其工作。
//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";
//set parameters
//you may set as many parameters as you have on your query
$params['color'] = blue;
//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);
您可以更改FETCH_TYPE以适合您的需求。
挂上您的经理并建立新连接:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
创建查询和fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
像这样从结果中获取数据:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
我发现答案可能是:
NativeQuery使您可以执行本机SQL,并根据您的规范映射结果。这种描述如何将SQL结果集映射到Doctrine结果的规范由ResultSetMapping表示。
来源:Native SQL。
我有同样的问题。您要查看实体管理器提供的连接对象:
$conn = $em->getConnection();
然后,您可以直接对其查询/执行:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
有关连接对象的文档,请参见http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
您不能,Doctrine 2不允许原始查询。似乎可以,但是如果尝试以下操作:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
主义将吐出一个错误,说DATE_FORMAT是一个未知函数。
但是我的数据库(mysql)确实知道该功能,所以基本上说来,Doctrine正在幕后(和背后)解析该查询,并找到一个它不理解的表达式,认为该查询无效。
因此,如果像我一样,您只想简单地将一个字符串发送到数据库并让它处理它(并让开发人员对安全性负全部责任),就算了吧。
当然,您可以对扩展进行编码,以某种方式允许这种扩展,但是您同样可以使用mysqli进行扩展,而将Doctrine保留为ORM事务。
mysqldump
s或从以前的转储或删除表中加载数据时,通常会为该工作编写一个shell脚本,然后以Symfony2语言编写一个任务(或“命令”) )执行shell脚本。据我所知,ORM的目的是抽象出重复的工作,如果您要进行诸如截断表格之类的工作,我不认为将Doctrine引入画面是有道理的,因为Doctrine并没有这样做。不会使这项任务变得更容易。