2016-05-16 12 views
4

2つのテーブル間のリンクを削除するために、エンティティリポジトリ内にqueryBuilderを作成しました。クエリビルダーを使用した2つのテーブル間のリンクの削除

私はこの2つのエンティティ

ドメイン持っている:私はSshKeys id内部sshKeysフィールドにあるときに、この2つのテーブル間のリンクを削除しようとしています

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

/** 
* @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をドメインテーブル。

だから私は私が参加してきたので、これはssh is not definedを返している理由を私は理解していない私の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)

このエイリアス。

このクエリビルダは機能するはずですか?私は本当にこれを解決する方法を本当に知りません。

ありがとうございました。

答えて

1

ドメインからsshKeyを削除するだけでドメインを削除したいのですがなぜですか?あなたは、たとえば次のようにメソッド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(); 

このような何か、それを呼び出す必要がありますリンクを削除する必要があります

関連する問題