我的项目中有一些路线是由于父子关系很长。
问题是Symfony仅通过其ID搜索实体。忽略路由中的所有其他参数。
例如,我有这条路线:
@Route("/projets/projet-{projet}/murs/mur-{mur}/obstacles/obstacle-{id}/", name="obstacle_edit")
editAction(Request $request, Obstacle $obstacle) {}
在这里,obstacle
是我要寻找的实体。
mur
是$obstacle->getMur()
并且projet
是obstacle->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 = ?
因此,忽略了路由中的其他两个参数。
如何确保不会忽略其他参数?
答案 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])
或更复杂的查询一样简单。