答案 0 :(得分:157)
以下是我正在做的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();
}
答案 1 :(得分:50)
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
答案 2 :(得分:39)
假设您正在使用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以满足您的需求。
答案 3 :(得分:12)
答案 4 :(得分:12)
连接到您的经理并建立新连接:
$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']);
答案 5 :(得分:5)
我遇到了同样的问题。您想要查看实体管理器提供的连接对象:
$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
处的连接对象的文档答案 6 :(得分:5)
在您的模型中创建原始SQL语句(下面的示例是我必须使用的日期间隔的示例,但是替换您自己的日期间隔。如果您正在执行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();
答案 7 :(得分:4)
你不能,Doctrine 2不允许原始查询。看起来你可以,但如果你尝试这样的话:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine会发出错误,说DATE_FORMAT是一个未知函数。
但是我的数据库(mysql)确实知道这个函数,所以基本上是hapening是Doctrine在幕后(并在你背后)解析那个查询并找到一个它不理解的表达式,考虑到查询无效。
因此,如果像我一样,你希望能够简单地将一个字符串发送到数据库并让它处理它(让开发人员对安全负全部责任),那就别忘了。
当然你可以编写一个扩展来以某种方式允许它,但你也可以使用mysqli来做它并将Doctrine留给它的ORM商业。