Symfony2 - 访问实体中的存储库功能

标签 symfony entity

假设我的数据库中有两个表: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/

相关文章:

INNER JOIN 和 DISTINCT 的 SQL 实体语法

symfony - 使用 Symfony Serializer 时如何解决 DateTimeNormalizer 问题

symfony - 在 Symfony 上设置 Redis 缓存前缀键

symfony - Sonata 用户 - 角色安全 访问被拒绝

ios - 核心数据 : How to structure a data model with a parent entity

entity-framework - Entity Framework 6.0.2 的源代码

实体系统 - 在管理器中与实体中存储组件

forms - form_widget不显示invalid_message错误

javascript - Symfony 4 - 如何使用 Javascript 删除 Twig 上的选择?

mysql - 如何在 Symfony2 中更新 mysql 数据库模式