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 Entity的特性,所以我想把它放在Entity中,但是从一个Entity访问另一个是不好的方式。
从Profile Repository访问另一个实体是否可以?
或者我应该使用服务??
答案 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,您可以:
从命令或控制器中的容器中获取它(例如在控制器$this->get('doctrine')->getManager();
中)
使用依赖注入配置文件将其注入服务(请参阅http://symfony.com/doc/current/service_container.html#injecting-services-config-into-a-service)
在存储库中使用它,因为存储库具有对它的本机访问权
通常人们将诸如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
?