使用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();