0

エンティティ オブジェクトではなくプロキシ クラスが作成されるのはなぜですか?

DoctrineORMModule\Proxy\__CG__\App\Entity\FormType vs \App\Entity\FormType

セットアップ: ラミナ、Doctrine ORM

    Class Project{}
    
    Class ProjectForm
    {
    /**
         * @ORM\Id
         * @ORM\Column(name="id")
         * @ORM\GeneratedValue
         */
        protected $id;
    
        /**
         * @ORM\OneToOne(targetEntity="FormType")
         * @ORM\JoinColumn(name="form_type_id", referencedColumnName="id")
         */
        protected $formType;
        
        /** 
         * @ORM\OneToOne(targetEntity="Project")
         * @ORM\JoinColumn(name="project_id", referencedColumnName="id")
         */
        protected $project;
    
        /** 
         * @ORM\Column(name="label")  
         */
        protected $label;
    
        /**
         * @ORM\Column(name="status")  
         */
        protected $status;
           
        /**
         * @ORM\Column(name="order_nr")
         */
        protected $order;
    }    
Class FormType
{/**
     * @ORM\Id
     * @ORM\Column(name="id")
     * @ORM\GeneratedValue
     */
    protected $id;
    
    /**
     * @ORM\Column(name="code")
     */
    protected $code;
    
    /**
     * @ORM\Column(name="label_txt")
     */
    protected $label;
:
:
}

次に、カスタムの拡張リポジトリを使用して、クエリ ビルダーを使用してストレージからデータを取得します。

 $qb->select('pc','ft')
        ->from(\App\Entity\ProjectForm::class,'pc')
        ->join(\App\Entity\FormType::class,'ft')   
        ->where($qb->expr()->eq('pc.project',$projectId))
        ->andWhere('pc.formType=ft.id');

生成された SQL は (プロジェクト ID 1 を渡す場合) 正しい/正しいように見え、正しい行数を返します

SELECT p0_.id AS id_0, p0_.label AS label_1, p0_.status AS status_2, p0_.order_nr AS order_nr_3, f1_.id AS id_4, f1_.code AS code_5, f1_.label_txt AS label_txt_6, p0_.form_type_id AS form_type_id_7, p0_.project_id AS project_id_8 FROM project_forms p0_ INNER JOIN form_types f1_ WHERE p0_.project_id = 1 AND p0_.form_type_id = f1_.id

同じ結果セットが次の方法で表示されます

$this->getEntityManager()->getRepository(\Eho\Core\Entity\ProjectForm::class)->findBy(['project'=>$projectId],[]);

$result[0]->getProject()->getTitle()正しい文字列を返しますが、getFormType() から$result[0]->getFormType()->getName()クラスが返されるため、スローとエラーが発生します...???\DoctrineORMModule\Proxy\__CG__\Entity\FormType

Project::getTite() -> string
ProjectForm->getName() -> string

編集:笑い声のために別の結合も試みました

$joinOn = \Doctrine\ORM\Query\Expr\Join::ON;
        $joinWith = \Doctrine\ORM\Query\Expr\Join::WITH;
        $qb->select('pf','ft')
        ->from(\App\Entity\ProjectForm::class,'pf')
        ->innerJoin(\App\Entity\FormType::class,'ft',$joinWith, 'pf.formType=ft.id')
        ->where($qb->expr()->eq('pf.project',$projectId));

SQL が生成された場合:

SELECT ...fields... FROM project_forms p0_ INNER JOIN form_types f1_ ON (p0_.form_type_id = f1_.id) WHERE p0_.project_id = 1

しかし、同じ結果セット (プロキシ クラスが返されます)...

1 つのエンティティ (プロジェクト) が正しく入力され、別のエンティティ (formType) がプロキシとして入力されるのはなぜですか?

4

0 に答える 0