【问题标题】:Get similar entities in Symfony using Doctrine使用 Doctrine 在 Symfony 中获取相似实体
【发布时间】: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();
}

两个问题:

  1. 如何在实体中获取 QueryBuilder,我不喜欢从控制器传递它。
  2. 有没有更好的方法来加载相似的条目?
  3. 如何按照最相似的顺序(上传器、参数 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


【解决方案1】:

您可以将所有这些匹配项相加:

SELECT
    *,
    (CAST(e.uploader = ?1 AS UNSIGNED)
    + CAST(e.param1 = ?2 AS UNSIGNED)
    + CAST(e.param2 = ?3 AS UNSIGNED)
    + CAST(e.param3 = ?4 AS UNSIGNED)
    ) AS matches_count
FROM video
ORDER BY matches_count DESC

【讨论】:

  • 这只是简单的 MySQL 对吧?但是我如何将它与 Doctrine 一起使用?当我添加$q->select('e, (CAST(e.uploader = ?0 AS UNSIGNED) + CAST(e.param1 = ?1 AS UNSIGNED)) AS matches_count') 并输入>orderBy('matches_count', 'DESC') 时,我得到一个异常[Syntax Error] line 0, col 11: Error: Expected known function, got 'CAST'。 Andy 知道如何用 Doctrine 编写它?
  • 我试试看。但这意味着没有真正的教义方式对吗?
  • 本机查询 - 是真正的教义方式:-) 但你也可以使用 DQL (doctrine-orm.readthedocs.org/en/latest/reference/…)。它与 SQL 非常相似。先试试吧。
  • true 原生查询是 Doctrine。我要说的是,如果没有办法用 DQL 来实现它。我更喜欢 DQL,因为在现实生活中,该表中还有一些其他字段,而在 DQL 中,我可以调用where()andWhere()orderBy()andOrderBy 等进行查询。例如,我在数据库中有语言环境,$locale 是该函数的可选参数。使用 DQL 函数,编写空洞查询就更容易了。 (或者我也可以将这些函数与本机查询一起使用吗?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
相关资源
最近更新 更多