2016-04-30 2 views
0

Я пытаюсь сделать обновление Dctrine 2 DQL с помощью соединения. Я читал, что вы не можете сделать это напрямую, но должны использовать подзапрос, вот мой код.DQL Вы не можете указать целевую таблицу 'user_addresses' для обновления в предложении FROM

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(); 
} 

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

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

/** 
* @var \Doctrine\ORM\PersistentCollection 
* 
* @ORM\OneToMany(targetEntity="Application\Entity\UserAddresses", cascade={"persist", "persist"}, mappedBy="user") 
*/ 
private $addresses; 

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

/** 
* @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 

я видел в других постах, которые вы должны сделать sub-select, но я не знаю, как это сделать в построителе запросов.

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

+0

Я также не знаю, как сделать это построитель запросов, но вы должны начать с правильного и работающего MySQL-запроса, а затем попытаться впоследствии его закодировать в строитель. –

ответ

0

я, наконец, понял, как сделать это в 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 является присоединиться к лицу пользователей, передав ей userId Учения сделали остальное.

Смежные вопросы

 Смежные вопросы