2

我在 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 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()->setPameter 执行任何 DQL... Symfony 将始终返回一个像这样的错误:

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

如果我用

@ORM\Column(name="id_perfiles", type="integer") 然后我可以使用实体构建 DQL,但这种关系将不再有效。

我在这里迷路了......似乎我在关系定义中遗漏了一些东西,但不知道。

提前感谢任何提示。

编辑

如果我使用:

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

它不会给出错误,但我需要过滤和排序结果。


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

无法识别的字段:id


$query=$em->getRepository('usuariosBundle:IPerfil')->createQueryBuilder('p')
        ->orderBy('id', 'ASC')
        ->getQuery();       
        $entities = $query->getResult();

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


$entities = $this->get('doctrine')->getEntityManager()->createQuery('SELECT p.id FROM usuariosBundle:IPerfil p ')->getResult(); 

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


4

2 回答 2

1

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

->orderBy('p.id', 'ASC')并且->createQuery('SELECT p FROM usuariosBundle:IPerfil p ')->getResult(),bundle 的名称是 usuarios os Usuarios 吗?

于 2012-12-21T13:08:35.490 回答
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 字段。

于 2013-02-06T16:14:29.180 回答