2

OneToMany 関係に Perfil と IPerfil という 2 つのエンティティがあります。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;  

そしてもう1つは:

>

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 は常に次のようなエラー:

[Semantical Error] 行 0、列 9 付近の 'id_perfiles FROM': エラー: 無効なパス式。StateFieldPathExpression である必要があります。

フィールド ID を

@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、列 60、'id ASC' 付近: エラー: 'id' が定義されていません。*


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

[セマンティカル エラー] 行 0、列 9 付近の 'id FROM usuariosBundle:IPerfil': エラー: 無効なパス式。StateFieldPathExpression である必要があります。


4

2 に答える 2

1

クラスの属性名を使用し、dql に列名を使用しない => 'id'

->orderBy('p.id', 'ASC')バンドルの->createQuery('SELECT p FROM usuariosBundle:IPerfil p ')->getResult()名前は 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();
}

そして今、私は正しい方向に遅延ロードし、必要な操作を行うことができます. コレクションとして宣言されておらず、ID フィールドであるため、Doctrine はコレクションを id にロードできなかったと思います。

于 2013-02-06T16:14:29.180 に答える