DQL 您不能在 FROM 子句中为更新指定目标 table 'user_addresses'
DQL You can't specify target table 'user_addresses' for update in FROM clause
我正在尝试通过连接进行 Doctrine 2 DQL 更新。我了解到您不能直接执行此操作,而必须使用子查询,这是我目前的代码。
public function unsetNonDefaultBillingAddresses($userId, $userAddressId)
{
$builder1 = $this->getEntityManager()->createQueryBuilder();
$subQuery = $builder1->select('a1.userAddressId')
->from('Application\Entity\UserAddresses', 'a1')
->leftJoin('a1.user', 'u')
->where('u.userId = ?1');
$builder2 = $this->getEntityManager()->createQueryBuilder();
$builder2->update('Application\Entity\UserAddresses', 'a2')
->set('a2.defaultBillingAddress', 0)
->where($builder2->expr()->in('a2.userAddressId', $subQuery->getDQL()))
->andWhere('a2.userAddressId != ?2')
->setParameter(1, $userId)
->setParameter(2, $userAddressId);
\Freedom\Logger\InfoLogger::vardump($builder2->getDQL());
return $builder2->getQuery()->execute();
}
我正在尝试更新用户 table 中特定用户 ID 的用户地址 table。这是我的加入代码。
用户table:
/**
* @var \Doctrine\ORM\PersistentCollection
*
* @ORM\OneToMany(targetEntity="Application\Entity\UserAddresses", cascade={"persist", "persist"}, mappedBy="user")
*/
private $addresses;
在我的用户地址 table:
/**
* @var \Application\Entity\Users
*
* @ORM\ManyToOne(targetEntity="Application\Entity\Users", inversedBy="addresses")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
* })
*/
private $user;
这是生成的 DQL:
UPDATE Application\Entity\UserAddresses a2
SET a2.defaultBillingAddress = 0
WHERE a2.userAddressId IN
(
SELECT a1.userAddressId
FROM Application\Entity\UserAddresses a1
LEFT JOIN a1.user u
WHERE u.userId = ?1
) AND a2.userAddressId != ?2
我在其他帖子中看到您必须执行子select,但我不知道如何在查询构建器中执行此操作。
非常感谢。
多亏了
,我终于弄明白了如何在 DQL 中做到这一点
这是我的最终代码。
public function unsetNonDefaultBillingAddresses($userId, $userAddressId)
{
$builder = $this->getEntityManager()->createQueryBuilder();
$builder->update('Application\Entity\UserAddresses', 'a')
->set('a.defaultBillingAddress', 0)
->where('a.user = ?1')
->setParameter(1, $userId)
->andWhere('a.userAddressId != ?2')
->setParameter(2, $userAddressId);
return $builder->getQuery()->execute();
}
a.user
是对用户实体的连接,通过将 userId
Doctrine 传递给它来完成剩下的工作。
我正在尝试通过连接进行 Doctrine 2 DQL 更新。我了解到您不能直接执行此操作,而必须使用子查询,这是我目前的代码。
public function unsetNonDefaultBillingAddresses($userId, $userAddressId)
{
$builder1 = $this->getEntityManager()->createQueryBuilder();
$subQuery = $builder1->select('a1.userAddressId')
->from('Application\Entity\UserAddresses', 'a1')
->leftJoin('a1.user', 'u')
->where('u.userId = ?1');
$builder2 = $this->getEntityManager()->createQueryBuilder();
$builder2->update('Application\Entity\UserAddresses', 'a2')
->set('a2.defaultBillingAddress', 0)
->where($builder2->expr()->in('a2.userAddressId', $subQuery->getDQL()))
->andWhere('a2.userAddressId != ?2')
->setParameter(1, $userId)
->setParameter(2, $userAddressId);
\Freedom\Logger\InfoLogger::vardump($builder2->getDQL());
return $builder2->getQuery()->execute();
}
我正在尝试更新用户 table 中特定用户 ID 的用户地址 table。这是我的加入代码。
用户table:
/**
* @var \Doctrine\ORM\PersistentCollection
*
* @ORM\OneToMany(targetEntity="Application\Entity\UserAddresses", cascade={"persist", "persist"}, mappedBy="user")
*/
private $addresses;
在我的用户地址 table:
/**
* @var \Application\Entity\Users
*
* @ORM\ManyToOne(targetEntity="Application\Entity\Users", inversedBy="addresses")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
* })
*/
private $user;
这是生成的 DQL:
UPDATE Application\Entity\UserAddresses a2
SET a2.defaultBillingAddress = 0
WHERE a2.userAddressId IN
(
SELECT a1.userAddressId
FROM Application\Entity\UserAddresses a1
LEFT JOIN a1.user u
WHERE u.userId = ?1
) AND a2.userAddressId != ?2
我在其他帖子中看到您必须执行子select,但我不知道如何在查询构建器中执行此操作。
非常感谢。
多亏了
,我终于弄明白了如何在 DQL 中做到这一点这是我的最终代码。
public function unsetNonDefaultBillingAddresses($userId, $userAddressId)
{
$builder = $this->getEntityManager()->createQueryBuilder();
$builder->update('Application\Entity\UserAddresses', 'a')
->set('a.defaultBillingAddress', 0)
->where('a.user = ?1')
->setParameter(1, $userId)
->andWhere('a.userAddressId != ?2')
->setParameter(2, $userAddressId);
return $builder->getQuery()->execute();
}
a.user
是对用户实体的连接,通过将 userId
Doctrine 传递给它来完成剩下的工作。