php - 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)作为代理......?
解决方案
推荐阅读
- python - 如何在python中使用可以支持不同大小数组的二维数组?
- r - 尝试使用 casewhen 基于另一列中字符的第一个单词在 Rstudio 中添加一列
- typescript - 更新到 v2.xx 后,PieChartProps 消失了
- .net - Azure DevOps 存储库,共享拉取请求
- symfony - Symfony - 如何获取控制器的主要路线?
- html - 更改输入 HTML 日期格式
- python - 分析恶意软件 APK 时是否应该关闭防病毒软件?
- python - 用于大数据的 Python3 的 Reed-Solomon 代码
- c# - 如何使用rigidbody.moveposition移动玩家,但将玩家移动到他正在寻找的位置并根据该移动玩家?
- excel - =0/1 和 0 之间的差异