首页 > 解决方案 > Doctrine ORM 协会创建 PHP 代理类

问题描述

为什么要创建代理类而不是实体对象?

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

设置:Laminas,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 Generated is/似乎是正确的(当传递项目 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

但是相同的结果集(返回代理类)......

为什么一个实体(项目)被正确填充而另一个(formType)作为代理......?

标签: phpdoctrine-ormlaminas

解决方案


推荐阅读