早上好,
它是否存在一个函数,我传递一个实体和propertyName,并返回一个实体的mappedBy,inversedBy和absoluteClassName。 目标是使用__call创建自动getteur / setteur和addFucntion bidirectionnal。 我不想使用生成实体我想要所有业余,设置和添加功能使用__call。 但是,如果我不知道关系是多对多还是一对多,如果我不知道mappedBy的名称,我就无法进行addBirectionnal。
我的代码:
public function __get($p){
return $this->$p;
}
public function __set($p,$v){
$this->$p = $v;
return $this;
}
public function __call($name,$arguments){
if(substr($name,1,3)=='et')
$name2 = substr(3);
if($name[0] == 'g'){
return $this->$name2;
}else{//substr($name,0,1) == 's'
$this->$name2 = $arguments[0];
/*for a one to one*/
/*$mappedByName= getmappedByOrInversedBy(get_class($name),$name2);
if($mappedByName){
$this->$name->$mappedByName = $this;/
}*/
return $this;
}
}
}
我需要getmappedByOrInversedBy,谢谢。
编辑:我试试这个
public function test(){
$str = "AppBundle\Entity\Group";
$mapping = new \Doctrine\ORM\Mapping\ClassMetadataInfo($str);
$d = $mapping->getAssociationMappedByTargetField('trad');
var_dump($d);
return $this->render('default/index.html.twig', array(
'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..'),
));
}
class Group
{
...
/**
* @ORM\OneToOne(targetEntity="Traduction",inversedBy="grp")
*/
protected $trad;
}
结果:未定义的索引:trad
答案 0 :(得分:2)
ClassMetadataInfo正是您要找的。 p>
使用entityName:
创建实例$mapping = new \Doctrine\ORM\Mapping\ClassMetadataInfo($entityNamespaceOrAlias);
然后,获取您想要的信息:
获取所有关联名称:$mapping->getAssociationNames();
获取协会的加入列:
$mapping->getSingleAssociationJoinColumnName($fieldName);
获取关联的mappedBy列:
$mapping->getAssociationMappedByTargetField($fieldName);
...
查看课程以了解您可以访问的方法 希望这是你所期望的。
修改强>
由于您可以访问EntityManager
(即从控制器),请使用:
$em = $this->getDoctrine()->getManager();
$metadata = $em->getClassMetadata('AppBundle:Group');
为确保您的实体名称空间没有问题,请尝试:
print $metadata->getTableName();
要检索实体的关联,请使用:
$metadata->getAssociationNames();
要获取现有关联的映射信息,请使用:
$metadata->getAssociationMapping($fieldName);
要获取实体的所有关联映射,请使用:
$metadata->getAssociationMappings();