假设我的数据库中有两个表:Rabbits 和 Carrots。
兔子可以有 0 个或多个胡萝卜,一个胡萝卜属于一只兔子。那是这两个表之间的 1,n 关系。
我有两个实体,兔子和胡萝卜。
我的模板中传递了一组兔子,我想从每只兔子身上获取特定的胡萝卜并展示它们:假设我想从每个 $ 中获取 10 个更贵的胡萝卜(胡萝卜价格将存储在胡萝卜表中)兔子在数组中。
就像是 :
{% for rabbit in rabbits %}
{% for carrot in rabbit.getMoreExpensiveCarrots %}
{{ carrot.price }}
{% endfor %}
{% endfor %}
我正在使用存储库类,但是如果我在兔子存储库类中创建一个函数 getMoreExpensiveCarrots( $rabbit ),我将无法从这样的实体类访问该函数,这就是我想要的:
$rabbit->getMoreExpensiveCarrots()
我认为一种方法是在兔子实体中创建一个 getMoreExpensiveCarrots() :
// Entity rabbit
class Rabbit
{
public function getMoreExpensiveCarrots()
{
// Access repository functions like getMoreExpensiveCarrots( $rabbit )
// But how can I do such thing ? Isn't that bad practise ?
return $carrots;
}
}
我以为我也可以这样做:
// Entity rabbit
class Rabbit
{
public function getMoreExpensiveCarrots()
{
$this->getCarrots();
// Then try here to sort the carrots by their price, using php
return $carrots;
}
}
这是我的 Controller :
public function indexAction()
{
$em = $this->getDoctrine()->getEntityManager();
$rabbits = $em->getRepository('AppNameBundle:Rabbit')->getSomeRabbits();
return $this->render('AppNameBundle:Home:index.html.twig',
array(
"rabbits"=>$rabbits
));
}
从模板中的每只兔子调用 getMoreExpensiveCarrots 函数的最佳实践是什么?
谢谢!
最佳答案
您的实体类应该只关心它们所代表的对象,并且完全不了解实体管理器或存储库。
此处可能的解决方案是使用包含 RabbitService
的服务对象 ( getMoreExpensiveCarrots
)方法。该服务可以了解实体管理器和存储库,因此您可以在此处执行任何复杂的操作。
通过使用服务对象,您可以保持关注点分离,并确保您的实体类完成它们的任务,仅此而已。
您也可以选择第二个选项,假设胡萝卜存储在 ArrayCollection 中。您只需在方法中执行您需要的任何排序逻辑。这很好,因为您将操作提供给实体的数据。
关于Symfony2 - 访问实体中的存储库功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9186970/