加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:04:40 所属栏目:PHP教程 来源:网络整理
导读:我在实体存储库中创建了一个queryBuilder来删除两个表之间的链接. 我有这两个实体 领域: /** * @var int * * @ORMColumn(type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */private $id;/** * @var string * * @ORMColumn(type="strin
我在实体存储库中创建了一个queryBuilder来删除两个表之间的链接.

我有这两个实体

领域:

/**
 * @var int
 *
 * @ORMColumn(type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORMColumn(type="string",length=64)
 * @AssertNotBlank
 * @AssertLength(max="64")
 * @AppAssertDomainName
 */
private $name;

// Some other fields

/**
 * @var SshKey[]|ArrayCollection
 *
 * @ORMManyToMany(targetEntity="AppBundleEntitySshKey",inversedBy="domains")
 * @ORMJoinTable(name="domain_sshkey",*   joinColumns={@ORMJoinColumn(referencedColumnName="id")},*   inverseJoinColumns={@ORMJoinColumn(name="key_id",referencedColumnName="id")}
 * )
 */
private $sshKeys;

和SshKeys:

/**
 * @var int
 *
 * @ORMColumn(type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var DateTime
 *
 * @GedmoTimestampable(on="create")
 * @ORMColumn(type="datetime")
 */
private $createdAt;

// Other fields

/**
 * @var Domain[]|ArrayCollection
 *
 * @ORMManyToMany(targetEntity="AppBundleEntityDomain",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返回了这个错误

[DoctrineORMQueryQueryException]
[Semantical Error] line 0,col 39 near ‘ssh.id IN(:s’: Error: ‘ssh’ is not defined.

[DoctrineORMQueryQueryException]
DELETE AppBundleEntityDomain d WHERE ssh.id IN(:ssh_keys_id)

我不明白为什么这是返回ssh没有定义,因为我已经使用此别名进行了连接.

此查询构建器应该工作吗?我真的不知道怎么解决这个问题.

谢谢你的帮助.

解决方法

当你只需要从域中删除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();

这应该删除链接

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读