时间:2010-07-24 12:09:28

标签: php sql doctrine

8 个答案:

答案 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商业。