原则2:使用查询构建器更新查询

Car*_*rlM 68 php sql database doctrine

嗨,我有以下查询但它似乎不起作用.

$q = $this->em->createQueryBuilder()
    ->update('models\User', 'u')
    ->set('u.username', $username)
    ->set('u.email', $email)
    ->where('u.id = ?1')
    ->setParameter(1, $editId)
    ->getQuery();
$p = $q->execute();
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误消息:

致命错误:未捕获异常'Doctrine\ORM\Query\QueryException',消息'[Semantical Error]第0行,第38位'testusername WHERE'附近:错误:'testusername'未定义.在......

我会很高兴有任何帮助

roj*_*oca 135

我认为你需要使用Expr->set():

$qb = $this->em->createQueryBuilder();
$q = $qb->update('models\User', 'u')
        ->set('u.username', $qb->expr()->literal($username))
        ->set('u.email', $qb->expr()->literal($email))
        ->where('u.id = ?1')
        ->setParameter(1, $editId)
        ->getQuery();
$p = $q->execute();
Run Code Online (Sandbox Code Playgroud)

无论是那个还是制作所有的值参数:

$qb = $this->em->createQueryBuilder();
$q = $qb->update('models\User', 'u')
        ->set('u.username', '?1')
        ->set('u.email', '?2')
        ->where('u.id = ?3')
        ->setParameter(1, $username)
        ->setParameter(2, $email)
        ->setParameter(3, $editId)
        ->getQuery();
$p = $q->execute();
Run Code Online (Sandbox Code Playgroud)

  • 您应该始终将变量作为参数传递给Doctrine查询! (5认同)
  • 你也可以``使用$ qb-> update(...) - > set('u.username',$ qb-> createNamedParameter($ username))``并省略 - > setParameter部分.那是IMO最好的方式.类似的方法是`` - > createPositionalParameter()``.见http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#binding-parameters-to-placeholders (5认同)

Stp*_*ane 6

假设您有一些后端显示用户列表(可由几个可能对用户详细信息具有读/写访问权限的管理员访问).
在那里,您可以在自己的行上打印用户ID作为数据属性,以便在某些事件被触发时从Javascript中检索它.

然后可以通过这种方式执行更新......

class UserRepository extends \Doctrine\ORM\EntityRepository
{
    public function updateUserStatus($userId, $newStatus)
    {
        return $this->createQueryBuilder('u')
            ->update()
            ->set('u.isActive', '?1')
            ->setParameter(1, $qb->expr()->literal($newStatus))
            ->where('u.id = ?2')
            ->setParameter(2, $qb->expr()->literal($userId))
            ->getQuery()
            ->getSingleScalarResult()
        ;
    }
Run Code Online (Sandbox Code Playgroud)

(ajax)处理行动中......

# Post datas may be:
# handled with a specific custom formType — OR — retrieved from request object
$userId = (int)$request->request->get('userId');
$newStatus = (int)$request->request->get('newStatus');
$em = $this->getDoctrine()->getManager();
$r = $em->getRepository('NAMESPACE\User')
        ->updateUserStatus($userId, $newStatus);
if ( !empty($r) ){
    # Row updated
}
Run Code Online (Sandbox Code Playgroud)

使用Doctrine 2.5的工作示例(在Symfony3之上).