我在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。
答案 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字段。