DQL нельзя указать целевую таблицу "user_addresses" для предложения update in FROM

Я пытаюсь сделать обновление DQL доктрины 2 с соединением. Я читал, что вы не можете сделать это напрямую, но должны использовать вложенный запрос, вот мой код до сих пор.

public function unsetNonDefaultBillingAddresses($userId, $userAddressId)
{
    $builder1 = $this->getEntityManager()->createQueryBuilder();
    $subQuery = $builder1->select('a1.userAddressId')
            ->from('ApplicationEntityUserAddresses', 'a1')
            ->leftJoin('a1.user', 'u')
            ->where('u.userId = ?1');

    $builder2 = $this->getEntityManager()->createQueryBuilder();
    $builder2->update('ApplicationEntityUserAddresses', 'a2')
            ->set('a2.defaultBillingAddress', 0)
            ->where($builder2->expr()->in('a2.userAddressId', $subQuery->getDQL()))
            ->andWhere('a2.userAddressId != ?2')
            ->setParameter(1, $userId)
            ->setParameter(2, $userAddressId);

    FreedomLoggerInfoLogger::vardump($builder2->getDQL());
    return $builder2->getQuery()->execute();
}

Я пытаюсь обновить таблицу UserAddress для определенного идентификатора пользователя из таблицы Users. Вот мой код присоединения.

Пользовательская таблица:

/**
 * @var DoctrineORMPersistentCollection
 *
 * @ORMOneToMany(targetEntity="ApplicationEntityUserAddresses", cascade={"persist", "persist"}, mappedBy="user")
 */
private $addresses;

и в моей таблице UserAddreses:

/**
 * @var ApplicationEntityUsers
 *
 * @ORMManyToOne(targetEntity="ApplicationEntityUsers", inversedBy="addresses")
 * @ORMJoinColumns({
 *   @ORMJoinColumn(name="user_id", referencedColumnName="user_id")
 * })
 */
private $user;

Вот результат DQL:

UPDATE ApplicationEntityUserAddresses a2
SET a2.defaultBillingAddress = 0
WHERE a2.userAddressId IN
(
    SELECT a1.userAddressId
    FROM ApplicationEntityUserAddresses a1
    LEFT JOIN a1.user u
    WHERE u.userId = ?1
) AND a2.userAddressId != ?2

Я видел в других сообщениях, что вы должны сделать дополнительный выбор, но я не знаю, как это сделать в построителе запросов.

Заранее большое спасибо.

1 ответ

  1. Я, наконец, понял, как это сделать в DQL благодаря https://stackoverflow.com/a/15297991/655741

    Вот мой окончательный код.

    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 является присоединением к сущности users, передавая ей userIdдоктрину, остальные.