使用查询生成器删除两个 table 之间的 link
Delete link between two table with a query builder
我在实体存储库中创建了一个 queryBuilder 来删除两个 table 之间的 link。
我有这两个实体
域名:
/**
* @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
位于域 table 内的 sshKeys
字段中时,我正在尝试删除这两个 table 之间的 links。
所以我在 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();
}
但是这个QBreturn这个错误
[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)
我不明白为什么这是 returning ssh is not defined
因为我已经用这个别名进行了连接。
这个查询生成器应该有用吗?我真的不知道怎么解决这个问题。
感谢您的帮助。
当您只需要从域中删除 sshKey(它们之间 link)时,为什么要删除域?
在域实体中,您可以像这样定义方法 removeSshKey,例如
public function removeSshKey(SshKey $key)
{
$this->sshKeys->removeElement($key);
return $this;
}
然后在您想要删除实体之间 link 的控制器中,您应该这样称呼它
$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();
这应该删除 link
我在实体存储库中创建了一个 queryBuilder 来删除两个 table 之间的 link。
我有这两个实体
域名:
/**
* @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
位于域 table 内的 sshKeys
字段中时,我正在尝试删除这两个 table 之间的 links。
所以我在 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();
}
但是这个QBreturn这个错误
[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)
我不明白为什么这是 returning ssh is not defined
因为我已经用这个别名进行了连接。
这个查询生成器应该有用吗?我真的不知道怎么解决这个问题。
感谢您的帮助。
当您只需要从域中删除 sshKey(它们之间 link)时,为什么要删除域?
在域实体中,您可以像这样定义方法 removeSshKey,例如
public function removeSshKey(SshKey $key)
{
$this->sshKeys->removeElement($key);
return $this;
}
然后在您想要删除实体之间 link 的控制器中,您应该这样称呼它
$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();
这应该删除 link