如何在symfony2存储库中建立多个表连接?实体?

时间:2017-09-21 12:01:07

标签: symfony repository entity

我有桌子 profile status

Profile.class

id name
1  taro
2  jiro
3  john

Status.class

id profile school           date
1  1       highschool       2017-04-01
2  1       juniorhighschool 2013-04-01
3  2       highschool       2017-04-01

状态更改时添加状态。

因此,每当我需要状态时,我通常会选择最新状态。

$ss = $this->em->createQuery(
  "SELECT cm FROM UserBundle:Status s where c.profile = :p order by desc")                 
                ->setParameters(['p' => $profile])->getResult();
$ss[0] // Latest Status

所以现在我想将其付诸实践。

我想要做的是从个人资料中获取最新状态。

我有一些想法

  • 将此功能放入个人资料实体?
  • 将此功能放入Profile Repository?
  • 将此功能投入使用???

在我看来它应该是Profile Entity的特性,所以我想把它放在Entity中,但是从一个Entity访问另一个是不好的方式。

从Profile Repository访问另一个实体是否可以?

或者我应该使用服务??

2 个答案:

答案 0 :(得分:0)

您可以使用ProfileRepository

中的方法实现此目的
<?php

public function getLastStatusByProfile(Profile $profile)
{
  // do our query from Profile with a join on Status
}

请在您的查询中使用LIMIT 1,您只需要最后的结果

答案 1 :(得分:0)

您不能将其放在实体中,因为实体不能注入Doctrine EntityManager依赖项($this->em)。 执行你的&#34; getLatestStatus()&#34;功能你需要EntityManager $this->em

要访问EntityManager,您可以:

通常人们将诸如getLatestStatus()之类的函数放在存储库中,存储库变为&#34;我们放置所有DQL查询的类&#34;这很好用。这是官方文档(https://symfony.com/doc/current/doctrine/repository.html)&#34的推荐;包含您的查询逻辑的方法可以存储在此类中。&#34;

Symfony Applications通常会:

  • 仅包含属性,getter,setter和一些额外逻辑函数的实体(如activate()disable() ...修改实体属性的函数)

  • 用于保存具有复杂逻辑的DQL查询的存储库,例如getLatestStatus()

  • 保留其他任何读取/修改数据的功能的服务

  • 控制器只是使用服务的网关

所以一个完整的例子是:

<?php

class ProfileRepository extends EntityRepository
{
    /**
     * @param Profile $profile 
     *
     * @return Status
     */
    public function getLatestStatus($profile)
    {
        $qb = $this->getEntityManager()->createQuery(
        "SELECT cm FROM UserBundle:Status s where c.profile = :p order by desc")                 
                ->setParameters(['p' => $profile])
                ->getResult();

        return $result;
    }
}

并且不要忘记处理没有&#34;状态的情况&#34;可用于此个人资料。您是希望返回null,提出异常还是返回默认status