【发布时间】:2014-12-13 05:15:23
【问题描述】:
我在 Symfony 中有一个用于视频的实体。假设数据库看起来像这样:
id: int
name: varchar
uploader: int (User Entity)
video_mp4: varchar
param1: int
param2: int
param3: int
我想加载类似的视频。类似的意思:
- 或同一个上传者
- 或相同的 Param1
- 或相同的Param2
- 或相同的Param3
实际上,我想按最匹配的方式对它们进行排序(这意味着由同一用户上传并具有相同 param1 + param3 的视频应该比仅匹配 param2 的视频更重要)类似ORDER BY mostMatches DESC 任何想法如何实现这一目标
为此,我将使用此查询(是的,我知道“OR”对数据库不利,欢迎提出建议;))
我在我的实体类中创建了一个如下所示的函数:($q 是一个 QueryBuilder)
public function getRelated($q, $limit = 6) {
$uploader = $this->getUploader()->getId();
$param1 = $this->getParam1();
$param2 = $this->getParam2();
$param3 = $this->getParam3();
$q->select('e')
->from('MyBackendBundle:Video','e')
->where('e.id != ?0')
->andWhere('e.uploader = ?1 OR e.param1 = ?2 OR e.param2 = ?3 OR e.param3 = ?4');
if ($limit > 0) {
$q->setMaxResults($limit);
}
$q->setParameters(array(
$this->id,
$uploader,
$param1,
$param2,
$param3
));
return $q->getQuery()->getResult();
}
两个问题:
- 如何在实体中获取 QueryBuilder,我不喜欢从控制器传递它。
- 有没有更好的方法来加载相似的条目?
- 如何按照最相似的顺序(上传器、参数 1、参数 2、参数 3)对它们进行排序,当然我可以使用 PHP 来执行此操作,但如果结果 7 是 100% 匹配但我只加载了 6 怎么办?
【问题讨论】:
-
1.相反,使用自定义存储库类 - symfony.com/doc/current/book/…
-
我首先在我的视频存储库类中拥有它,但后来决定将它移动到实体,因为否则我需要传递 id、param1、param2、param3(以及在现实生活中的一些其他内容,如可见、发布日期等)到该函数。在实体中,我可以使用 $this->... 从实体本身中获取所有这些功能
-
您可以在 Repository 类中使用您的实体。而不是
$this->...,它将是$entity->...。 -
不错。不知道这个。但我会试一试。
标签: mysql symfony doctrine-orm doctrine dql