【问题标题】:Set up non-persistent relation in Doctrine 2在 Doctrine 2 中建立非持久关系
【发布时间】:2016-03-05 12:41:12
【问题描述】:

我有一个对象 $user,它与 $establishment 有一对多的关系。我可以使用:

$user->getEstablishments();

用户可以选择要从事的工作。我有我在控制器中调用的这个方法:

$user->setCurrentEstablishment($establishment);

还有我在视图中调用的这个:

$establishment = $user->getCurrentEstablishment();

我希望能够打电话:

$user->setCurrentEstablishmentBy Slug($establishment_slug);

其中slug是一个字符串,并让用户对象寻找建立。

Doctrine 不鼓励在 Entity 对象内部访问 Entity Manager 的做法,但我认为在控制器中使用它更糟糕。

我怀疑存在一些特殊的 Doctrine 注释来处理这样的非持久关系,或者这里应该使用除了通过服务为实体管理器提供服务之外的其他方法。从模型内部引用其他实体的一些简单方法。

¿ 有吗? ¿ 我怎么能那样做?

【问题讨论】:

  • 为什么你认为在控制器中使用实体管理器不好?
  • 您应该在控制器或服务中使用它(例如 UserService - 您需要创建它)。
  • 并不是说在控制器中使用实体管理器不好。这是实体应该给你一些关于它自己的相关数据,而你不必自己在控制器中收集它。就像它给你通常的持久关系一样,它也应该给你运行时的、非持久的关系,就像我的例子中的相关记录一样。只是我的意见。

标签: symfony doctrine-orm doctrine


【解决方案1】:

Doctrine 中没有 Annotation 可以将 slug 转换为对象。

ParamConverter 可以帮到你,它可以自动将 slug 从查询转换为对象。但它仍然必须在Controller中使用。

示例用法:

/**
* @Route("/some-route/{slug}")
* @ParamConverter("object", class="AppBundle:Establishment", options={"id" = "slug", "repository_method" = "findEstablishmentBySlug"})
*/
public function slugAction(Establishment $object)
{
...

参数转换器文档:http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

【讨论】:

  • 只有我一个人认为不能做到这一点很糟糕吗?
猜你喜欢
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多