如何访问属性的注释(class,mappedBy,inversedBy)

时间:2016-02-06 12:22:04

标签: symfony

早上好,

它是否存在一个函数,我传递一个实体和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

1 个答案:

答案 0 :(得分:2)

ClassMetadataInfo正是您要找的。

使用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();