使用Doctrine 2执行原始SQL

我想使用Doctrine 2执行原始SQL

我需要截断数据库表,并用默认的testing数据初始化表。

以下是我在做的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(); } 
 //$sql - sql statement //$em - entity manager $em->getConnection()->exec( $sql ); 

假设你正在使用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以满足您的需求。

我发现答案可能是:

NativeQuery允许您执行本地SQL,根据您的规范映射结果。 描述如何将SQL结果集映射到Doctrine结果的规范由ResultSetMapping表示。

来源: 原生SQL 。

如何执行原始查询并返回数据。

钩上你的经理,build立新的联系:

 $manager = $this->getDoctrine()->getManager(); $conn = $manager->getConnection(); 

创build您的查询和fetchAll:

 $result= $conn->query('select foobar from mytable')->fetchAll(); 

从这样的结果中获取数据:

 $this->appendStringToFile("first row foobar is: " . $result[0]['foobar']); 

我有同样的问题。 你想看看实体pipe理器提供的连接对象:

 $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是一个未知的function。

但是我的数据库(mysql)确实知道这个函数,所以基本上什么是hapening是Doctrine在后台parsing这个查询(并且在你后面)并且find一个它不理解的expression式,考虑到这个查询是无效的。

所以,如果像我一样,只要简单地向数据库发送一个string并让它处理(让开发者对安全承担全部责任),就忘了它。

当然,你可以编写一个扩展来以某种方式来允许这种扩展,但是你也可以使用mysqli来做到这一点,并把它放在ORM的buisness中。

在你的模型中创build原始的SQL语句(下面的例子是我不得不使用的date间隔的一个例子,如果你正在做一个SELECT add – > fetchall()execute()调用。

  $sql = "DELETE FROM tmp WHERE lastedit + INTERVAL '5 minute' < NOW() "; $stmt = $this->getServiceLocator() ->get('Doctrine\ORM\EntityManager') ->getConnection() ->prepare($sql); $stmt->execute();