1

我正在尝试在 Doctrine 中执行本机 SQL。基本上我有2个参数:

  • CANDIDATE_ID - 我们删除条目的用户,
  • 要保留的 FILE_ID 列表

所以我做

$this->getEntityManager()->getConnection()->
    executeUpdate( "DELETE FROM FILE WHERE CANDIDATE_ID = :ID AND NOT ID IN :KEEPID",
        array(
            "ID" => $candidate->id,
            "KEEPID" => array(2) )
    );

但是教义失败了:

Notice: Array to string conversion in D:\xampp\htdocs\azk\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php on line 786

这是Doctrine中的错误吗?我正在使用其他地方进行选择,IN但使用 QueryBuilder 并且它正在工作。也许有人可以建议更好的删除条目的方法,例如使用 QueryBuilder?

4

2 回答 2

3
$stmt = $conn->executeQuery('SELECT * FROM articles WHERE id IN (?)',
    array(array(1, 2, 3, 4, 5, 6)),
    array(\Doctrine\DBAL\Connection::PARAM_INT_ARRAY)
);

来自Doctrine 的文档

于 2013-05-31T15:13:03.263 回答
1

您不能将 ID 数组传递给参数。您可以对标量值执行此操作,但即使它有一个“toString”,它也不是您想要的。

字符串连接是一种方法,

"DELETE FROM FILE WHERE CANDIDATE_ID = :ID AND NOT ID IN (". implode(",", $list_of_ids) .")"

但是这种方法直接绕过参数,因此在可读性方面受到影响,并且仅限于某个最大行长度,这可能因数据库而异。

另一种方法是编写一个返回表结果的函数,该函数将一串 ID 作为参数。

您还可以通过连接到包含要保留的 ID 的表来解决此问题。

这是我多次看到的问题,但很少有好的答案,但这通常是由于对数据库建模方式的误解造成的。这是数据库访问的“代码气味”。

于 2013-04-25T21:21:15.283 回答