Doctrine orm 原则,具有常数enty属性的复合密钥?
我必须处理一个可能包含错误的模型。 必须处理多种类型对象的标记系统。让我们举一个预期用途的例子。 Tags entity是一个标记id、名称、问题实体,用于处理必须在许多$Tags中使用标记系统的对象。TagsLink是链接到许多对象的所有标记的注册表,即:问题。 问题::$tags是标记的集合,它包含链接到任何对象id_元素的所有标记=问题::$id。不能使用TagsLink::$type_元素筛选此关系 那么,我的问题是,是否可以在问题中添加一个值:$tags关联,它按id\u元素和type\u元素过滤集合?是否可以使用伪列来处理伪复合键id\u元素,type\u元素?在关联中,我可以在@JoinTable上使用类型为_element=实体类名的限制吗 因此,实体定义:Doctrine orm 原则,具有常数enty属性的复合密钥?,doctrine-orm,zend-framework2,doctrine,doctrine-query,Doctrine Orm,Zend Framework2,Doctrine,Doctrine Query,我必须处理一个可能包含错误的模型。 必须处理多种类型对象的标记系统。让我们举一个预期用途的例子。 Tags entity是一个标记id、名称、问题实体,用于处理必须在许多$Tags中使用标记系统的对象。TagsLink是链接到许多对象的所有标记的注册表,即:问题。 问题::$tags是标记的集合,它包含链接到任何对象id_元素的所有标记=问题::$id。不能使用TagsLink::$type_元素筛选此关系 那么,我的问题是,是否可以在问题中添加一个值:$tags关联,它按id\u元素和type
class Tags {
/**
* Tag primary key
* @ORM\Id;
* @ORM\Column(type="integer");
* @ORM\GeneratedValue(strategy="AUTO");
*/
protected $id;
}
class TagsLink {
/**
* Element type (page, widget, etc ...)
* @ORM\Id
* @ORM\Column(type="string")
*/
protected $type_element;
/**
* Element foreign key
* @ORM\Id
* @ORM\Column(type="integer")
*/
protected $id_element;
}
class Question {
/**
* @ORM\Id
* @ORM\Column(type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* Tags linked
* @ORM\ManyToMany(targetEntity="Application\Entity\Tags", cascade={"persist","remove"})
* @ORM\JoinTable(name="tags_link",
* joinColumns={@ORM\JoinColumn(name="id_element", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="id_tag", referencedColumnName="id")}
* );
* @var ArrayCollection
*/
protected $tags;
}
希望我能在这个多云的问题上有一些灯光
编辑:具有特征的解决方案
<?php
/**
* Fonctionnalité de Tag.
* Attribuable à une entité quelconque des modèles utilisés.
*
* @author lolallalol
*/
namespace Application\DoctrineExtension;
use Application\Entity\Tags;
use Application\Entity\TagsLink;
use Doctrine\ORM\Mapping as ORM;
trait Tagable {
/**
* Type de ressource (TagsLink.type_element)
* @var string
*/
private $_type;
/**
* Collection de tags
* @var ArrayCollection
*/
private $_tags;
/**
* Filtre les tags rattachés au bon type de ressource
* Bricollage de l'association avec clé composée sans persistance
* @ORM\PostLoad
*/
public function postLoadHandler($item) {
$o = $item->getObject();
$class = new \ReflectionClass(get_class($o));
$type = $class->getConstant('TAG_TYPE');
$this->setTagType($type);
$assocs = $item->getEntityManager()->getRepository('Application\Entity\TagsLink')->findByTypeAndId($this->getTagType(), $o->id);
$tags = array();
$ids = array();
if (count($assocs) > 0) {
foreach ($assocs as $l) {
$ids[] = $l->id_tag;
}
$tags = $item->getEntityManager()->getRepository('Application\Entity\Tags')->findById($ids);
}
$this->_tags = $tags;
}
/**
* Attribution du type de ressource
* @param string $type
*/
public function setTagType($type) {
$this->_type = $type;
}
/**
* Retourne le type de ressource taggué
* @return string
* @throws Exception Mauvaise implémentation du Trait Tagable
*/
public function getTagType() {
if (!$this->_type) {
$cname = get_class(parent);
$class = new \ReflectionClass($cname);
$type = $class->getStaticPropertyValue('TAG_TYPE');
if (!$type) {
throw new Exception('Tagable object "'.$cname.'" whithout const TAG_NAME');
}
$this->setTagType($type);
}
return $this->_type;
}
/**
* Ajout d'un Tag a une ressource
* @param Tag $tag Tag à ajouter à la collection
* @return TagsLink
*/
public function addTag(Tags $tag) {
$tagL = new TagsLink();
$tagL->id_element = parent::id;
$tagL->type_element = $this->getTagType();
$tagL->id_tag = $tag->id;
$this->em->persist($tagL);
$this->em->flush();
$this->_tags[] = $tagL;
return $tagL;
}
/**
* Supprime un tag associé
* @param Tag $tag Tag à supprimer de la collection
* @return boolean
*/
public function removeTag(Tag $tag) {
$r = false;
$tagL = new TagsLink();
$tagL->id_element = parent::id;
$tagL->type_element = $this->getTagType();
$tagL->id_tag = $tag->id;
if ($this->_tags->contains($tagL)) {
$r = true;
$this->_tags->removeElement($tagL);
$this->em->remove($tagL);
$this->em->flush();
}
return $r;
}
/**
* Retourne la collection des Tags associés à l'objet
* @return ArrayCollection
*/
public function getTags() {
return $this->_tags;
}
}
我正试图利用一种特质来完成这项工作。看起来很复杂…你能修改一下你的问题吗?因为你不太清楚你想要什么,你首先试着画一个场景,然后问几个问题。你想要一个关于Tags:Question的M:M,但是你确实使用了TagsLink的字段,所以我不知道你想要实现什么。我找到了一个带有特征的解决方案。TagsLink是标记和对象的关联。在我的示例中,一种关联的对象是疑问。为了处理这类对象,我添加了一个列TagsLink.type_element。好的,你能在这里发布你的答案吗?如果其他人遇到同样的问题,他们可以使用你的例子。别忘了把你的答案标记为解决方案;