php - 使用查询构建器删除两个表之间的链接

标签 php symfony doctrine-orm dql

我在实体存储库中创建了一个 queryBuilder 来删除两个表之间的链接。

我有这两个实体

域名:

/**
 * @var int
 *
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(type="string", length=64)
 * @Assert\NotBlank
 * @Assert\Length(max="64")
 * @AppAssert\DomainName
 */
private $name;

// Some other fields

/**
 * @var SshKey[]|ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\SshKey", inversedBy="domains")
 * @ORM\JoinTable(name="domain_sshkey",
 *   joinColumns={@ORM\JoinColumn(referencedColumnName="id")},
 *   inverseJoinColumns={@ORM\JoinColumn(name="key_id", referencedColumnName="id")}
 * )
 */
private $sshKeys;

和 SshKeys:

/**
 * @var int
 *
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var \DateTime
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $createdAt;

// Other fields

/**
 * @var Domain[]|ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Domain", mappedBy="sshKeys")
 */
private $domains;

当 SshKeys id 位于域表内的 sshKeys 字段中时,我试图删除这两个表之间的链接。

所以我在我的 DomainRepository

中创建了这个查询生成器
public function deleteSshkeyDomainLink($invalidSshkey)
{
    $qb = $this->createQueryBuilder('d');

    $qb->delete()
       ->where($qb->expr()->in('ssh.id', ':ssh_keys_id'))
       ->setParameter('ssh_keys_id', $invalidSshkey)
       ->join('d.sshKeys', 'ssh')
    ;

    return $qb->getQuery()->execute();
}

但是这个QB返回这个错误

[Doctrine\ORM\Query\QueryException]
[Semantical Error] line 0, col 39 near 'ssh.id IN(:s': Error: 'ssh' is not defined.

[Doctrine\ORM\Query\QueryException]
DELETE AppBundle\Entity\Domain d WHERE ssh.id IN(:ssh_keys_id)

我不明白为什么返回 ssh is not defined 因为我已经使用这个别名进行了连接。

这个查询生成器应该有用吗?我真的不知道如何解决这个问题。

感谢您的帮助。

最佳答案

当你只需要从域(它们之间的链接)中删除 sshKey 时,你为什么要删除域?

例如,在域实体中,您可以像这样定义方法 removeSshKey

public function removeSshKey(SshKey $key)
{
    $this->sshKeys->removeElement($key);

    return $this;
}

然后在您想要删除实体之间链接的 Controller 中,您应该这样调用它

$domain = $this->getDoctrine()->getRepository('Domain')->find($domainId);
foreach ($domain->getSshKeys() as $sshKey)
{
    if ($sshKey->getId() == $invalidSshKeyId)
    {
        $domain->removeSshKey($sshKey);
    }   
}
$em = $this->getDoctrine()->getManager();
$em->flush();

这应该删除链接

关于php - 使用查询构建器删除两个表之间的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37249414/

相关文章:

php - Doctrine 迁移重新。固定装置

php - 如何在 PDO 中绑定(bind)当前列值?

symfony - Cmf路由 + JMSI8n路由 : how to make them work together?

php - FosUserBundle 在 FilterUserResponseEvent 中重定向

php - 如何仅在 Doctrine 中按日期部分分组

php - 如何在具有多个数据库的 CodeIgniter 中存储数据库 session ?

php - 如何使输入字段将文本带入单独页面上的 Google 自定义搜索

php - 在 Symfony2 中反序列化或解析 XML 响应

php - Symfony2 给出空白页

php - 使用已建立的 PDO 连接与 Doctrine Master/Slave 连接