Symfony2在实体中构建ManyToOne关系

时间:2012-12-21 13:00:31

标签: symfony oracle11g entity

我在OneToMany关系中有两个实体,Perfil和IPerfil。 Perfil可以有几个IPerfil关联:

>

    class Perfil  
    {  
    /**  
     * @var integer $id  
     *  
     * @ORM\Column(name="id_perfiles", type="integer")  
     * @ORM\Id  
     * @ORM\GeneratedValue(strategy="SEQUENCE")  
     * @ORM\SequenceGenerator(sequenceName="P360.perfiles_seq")  
     * @ORM\OneToMany(targetEntity="IPerfil", mappedBy="id")  
*/  
    private $id;  

class Perfil { /** * @var integer $id * * @ORM\Column(name="id_perfiles", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="SEQUENCE") * @ORM\SequenceGenerator(sequenceName="P360.perfiles_seq") * @ORM\OneToMany(targetEntity="IPerfil", mappedBy="id") */ private $id;

另一个:

>

class IPerfil  
{  
    /**  
     * @var integer $id
     * @ORM\ManyToOne(targetEntity="Perfil")  
     * @ORM\JoinColumn(name="id_perfiles", referencedColumnName="id_perfiles", onDelete="CASCADE")  
*/  
    protected $id;

我能够从IPerfil延迟到Perfil,但不能从另一个方向(从Perfil到IPerfil),但如果我不能通过IPerfil或createQueryBuilder()进行任何DQL - > gt; setPameter ... Symfony将始终返回如下错误:

  

[语义错误]第0行,第9行靠近'id_perfiles FROM':错误:无效的PathExpression。必须是StateFieldPathExpression。

如果我用

定义字段Id
  

class IPerfil { /** * @var integer $id * @ORM\ManyToOne(targetEntity="Perfil") * @ORM\JoinColumn(name="id_perfiles", referencedColumnName="id_perfiles", onDelete="CASCADE") */ protected $id;   然后我可以用实体构建DQL,但这种关系将不再起作用。

我在这里迷路了...似乎我在关系定义中遗漏了一些东西,但是没有任何线索。

提前感谢任何提示。

修改

如果我使用:

它确实给出了错误,但我需要过滤并对结果进行排序。


@ORM\Column(name="id_perfiles", type="integer")

无法识别的字段:id


$entities=$em->getRepository('usuariosBundle:IPerfil')->findAll(array());

* [语义错误]第0行,第60行附近'id ASC':错误:未定义'id'。 *


$entities=$em->getRepository('usuariosBundle:IPerfil')->findBy(array(),array('id' => 'asc', 'descripcion' => 'asc'));

[语义错误]第0行,第9行附近'id FROM usuariosBundle:IPerfil':错误:无效的PathExpression。必须是StateFieldPathExpression。


2 个答案:

答案 0 :(得分:1)

使用类的属性名称,dql =>上没有列名'ID'

->orderBy('p.id', 'ASC')->createQuery('SELECT p FROM usuariosBundle:IPerfil p ')->getResult(),捆绑包的名称是usuarios os Usuarios?

答案 1 :(得分:0)

如果对任何人都有用,我最终在Perfil实体中创建了一个非持久属性来附加关系和IPerfil的集合:

/** 
* @ORM\OneToMany(targetEntity="IPerfil", mappedBy="id") 
*/ 
private $desc; 

需要将其声明为ArrayCollection:

public function __construct()
{
    $this->desc = new \Doctrine\Common\Collections\ArrayCollection();
}

现在我可以向正确的方向延迟加载并进行任何必要的操作。我认为Doctrine无法将集合加载到id中,因为它没有被声明为集合而且它是ID字段。