Php 使用原则2执行原始SQL

Php 使用原则2执行原始SQL,php,sql,doctrine,Php,Sql,Doctrine,我想使用原则2执行原始SQL 我需要截断数据库表并使用默认测试数据初始化表。我发现答案可能是: NativeQuery允许您执行本机查询 SQL,根据 你的规格。这样的 描述 SQL结果集映射到条令 结果由一个 结果映射 来源:。我也有同样的问题。要查看实体管理器提供的连接对象: $conn = $em->getConnection(); 然后可以直接对其进行查询/执行: $statement = $conn->query('select foo from bar'); $num_

我想使用原则2执行原始SQL


我需要截断数据库表并使用默认测试数据初始化表。

我发现答案可能是:

NativeQuery允许您执行本机查询 SQL,根据 你的规格。这样的 描述 SQL结果集映射到条令 结果由一个 结果映射


来源:。

我也有同样的问题。要查看实体管理器提供的连接对象:

$conn = $em->getConnection();
然后可以直接对其进行查询/执行:

$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');

有关连接对象的文档,请参见

,这里是我正在执行的条令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();
}   
如何执行原始查询并返回数据。 连接到您的经理并建立新连接:

$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
创建查询并获取全部:

$result= $conn->query('select foobar from mytable')->fetchAll();
按如下方式从结果中获取数据:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);

在您的模型中,创建原始SQL语句(下面的示例是我必须使用的日期间隔示例,但替换为您自己的日期间隔。如果您正在对execute()调用执行SELECT add->fetchall()

$sql=“从tmp中删除
其中lastedit+间隔“5分钟”getServiceLocator()
->获取('Doctrine\ORM\EntityManager')
->getConnection()
->准备($sql);
$stmt->execute();

假设您使用的是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);

您可以更改获取类型以满足您的需要。

您不能,原则2不允许原始查询。看起来您可以,但如果您尝试以下操作:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
条令将抛出一个错误,说DATE_格式是一个未知函数

但是我的数据库(mysql)确实知道这个函数,所以基本上,hapening的原则是在幕后(以及在你背后)解析该查询,并找到一个它不理解的表达式,认为该查询是无效的

因此,如果像我一样,您希望能够简单地向数据库发送一个字符串,并让它处理它(并让开发人员对安全性承担全部责任),那么请忘记它


当然,你可以编写一个扩展代码,以某种方式来实现这一点,但你也可以使用mysqli来实现这一点,并将条令留给它的ORM业务。

这是公认的答案,但我仍然不明白条令的这一部分如何有用,因为你总是需要结果映射。我不希望它将结果映射到实体..这就是运行任意SQL的默认点!@MikeMurko我发现这篇文章有助于在条令2中运行原始查询:非本机SQL也不会执行所有可能的SQL查询。删除/更新/插入不起作用,也不会执行一些不符合条令假设的表定义。(M2M加入没有ID的表)。所以这个答案不是通用的。也不应该被接受,因为插入不起作用。顺便说一句,当我想做自动化的数据库gruntwork时,比如做
mysqldump
s或者从以前的转储或删除表中加载数据,我通常会为这项工作编写一个shell脚本,然后编写一个任务(或者用Symfony2语言编写的“命令”)这将执行shell脚本。据我所知,ORM的目的是抽象掉重复的工作,如果您正在执行类似于截断表的操作,我看不出将条令引入到图中有什么意义,因为条令并不能使该任务变得更简单。调用prepare()也是一个好主意而不是exec,这样您仍然可以获得准备好的语句支持。$em->getConnection()->executeQuery($sql)now:-)回答得不错。要在这段代码中获得实体管理器,您可以使用$this->getDoctrine()->getManager()代替“$this->getEntityManager()”上面的代码,这样它就可以直接为我工作了。嘿,它给我调用了未定义的方法Index::getDoctrine())我该怎么办?我用codeigniter和条令2这让我走上了正确的方向,但这并不是我所需要的。我怀疑答案的年龄会有所不同。我使用了:
…getConnection()->query($sql)并且不必运行
$stmt->execute()
注意,使用Symfony4和自动连线,您可以键入hint
entityManager接口$entityManager
,然后调用
$entityManager->getConnection()
所有查询()中最好的例子是当SQL返回一些您想要使用的数据时;exec()用于不使用的情况