使用查询生成器删除两个表之间的链接


Delete link between two table with a query builder

我在实体存储库中创建了一个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返回这个错误

[条令''ORM''Query''QueryException]
[语义错误]"ssh.id IN"附近第39列第0行(:s):错误:未定义"ssh"。

[条令''ORM''Query''QueryException]
DELETE AppBundle''Entity''Domain d WHERE ssh.id IN(:ssh_key_id)

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

这个查询生成器应该工作吗?我真的不知道该怎么解决。

谢谢你的帮助。

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

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

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

然后在控制器中,在您想要删除实体之间的链接的地方,您应该将其称为类似于的东西

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

这应该会删除链接