@Route-如何确保学说也检查父实体

时间:2018-10-28 15:18:53

标签: symfony doctrine-orm annotations doctrine symfony-3.4

我的项目中有一些路线是由于父子关系很长。

问题是Symfony仅通过其ID搜索实体。忽略路由中的所有其他参数。

例如,我有这条路线:

@Route("/projets/projet-{projet}/murs/mur-{mur}/obstacles/obstacle-{id}/", name="obstacle_edit")
editAction(Request $request, Obstacle $obstacle) {}

在这里,obstacle是我要寻找的实体。
mur$obstacle->getMur()
并且projetobstacle->getMur()->getProjet()

因此,我的form标签是这样的:

<form action="{{ path('obstacle_edit', { 'projet': obstacle.mur.projet.id, 'mur': obstacle.mur.id, 'id': obstacle.id }) }}" method="POST"></form

但是,Doctrine运行此查询:

SELECT 
  t0.id AS id_1, 
  t0.nom AS nom_2, 
  t0.posx AS posx_3, 
  t0.posy AS posy_4, 
  t0.posz AS posz_5, 
  t0.dimx AS dimx_6, 
  t0.dimy AS dimy_7, 
  t0.dimz AS dimz_8, 
  t0.mur_id AS mur_id_9 
FROM 
  obstacle t0 
WHERE 
  t0.id = ?

因此,忽略了路由中的其他两个参数。

如何确保不会忽略其他参数?

1 个答案:

答案 0 :(得分:2)

您可以通过使用注释显式覆盖行为来修改实体的加载方式。参见:https://symfony.com/doc/master/bundles/SensioFrameworkExtraBundle/annotations/converters.html#fetch-via-an-expression

在您的情况下,可能看起来像这样:

/**
 * @Route("/projets/projet-{projet}/murs/mur-{mur}/obstacles/obstacle-{id}/", name="obstacle_edit")
 * @Entity("obstacle", expr="repository.findObstacleByProjectMurAndId(projet, mur, id)")
 */
public function editAction(Request $request, Obstacle $obstacle) { ... }

您随后放入此存储库中的实际查询逻辑。根据您的确切需求,这可能像包装findBy(['mur' => $mur, 'projet' => $projet, 'id' => $id])或更复杂的查询一样简单。