【问题标题】:Symfony query with Doctrine使用 Doctrine 进行 Symfony 查询
【发布时间】:2017-11-30 19:07:41
【问题描述】:

我正在做一个小练习以使用 Symfony 3 提高自己。我在构建查询以获取未链接到应用程序且日期超过 30 天的广告时出错。

我在控制器中创建了一个新方法,在我的 advertRepository 中创建了一个新查询,以及一个名为“Purger”的服务,我必须在其中删除这些旧广告。

我将下面的代码粘贴给您(控制器、服务类、AdvertRepository、services.yml):

public function purgeAction($days) 
{
  // Appel du service
  $testPurge = $this->get('oc_platform.purger.advert');
  $testPurge->purge($days);

  return new Response("Purge done !");
}

namespace OC\PlatformBundle\Purger\Advert;

use OC\PlatformBundle\Entity\Advert;
use Doctrine\ORM\EntityManager;

class OCAdvertsPurger 
 {
  private $em;

  public function __construct(EntityManager $em)
  {
    $this->em = $em;
  }

  //Ce service va récupérer et supprimer toutes les annonces dont la date de 
  modification
  // est plus vieille que X jours. Ce "X" est le paramètre de la méthode.
  public function purge($days)
   {
     $listAdverts = $this->em->getRepository('OCPlatformBundle:Advert')-
     >getOldAdvertsOnly($days);
   }
 }


public function getOldAdvertsOnly($days)
{
  // Liste de toutes les annonces
  $qb = $this->createQueryBuilder('a')
    ->leftJoin('a.applications', "app")
    ->addSelect('app')
  ;

  // On retire celles attachées à des candidatures
  $qb->where($qb->expr()->isNull('app.advert_id'));

  return $qb
    ->getQuery()
    ->getResult()
  ;
}

public function deleteOldAdvertsOnly($adverts)
{ 
  $qb = $this->createQuery('DELETE $adverts FROM 
  OC\PlatformBundle\Entity\Advert  WHERE DATE_DIFF(CURRENT_DATE(), 
  updated_at) > $days');

  return $qb
    ->getQuery()
    ->getResut()
  ;
}
    services:
        oc_platform.purger.advert:
        class: OC\PlatformBundle\Purger\Advert\OCAdvertsPurger
        arguments: 
            - "@doctrine.orm.entity_manager"

我尝试在与 queryBuilder 相同的查询中对 DATE_DIFF function() 执行某些操作,但出现错误,因为 queryBuilder() 不知道此函数为 CURRENT_DATE() 我想所以我试图让它与两种不同的查询(一种使用 queryBuilder,一种使用 DQL 语言)。

非常感谢你帮助我!

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    要使用 DATEDIFF 功能(或任何其他功能),您必须安装 Doctrine Extension :

    composer require beberlei/DoctrineExtensions (https://github.com/beberlei/DoctrineExtensions)

    在你的 config.yml 中:

    orm:
     entity_managers:
      default:
        dql:
          datetime_functions:
            DateDiff: DoctrineExtensions\Query\Mysql\DateDiff
    

    您现在可以像在 SQL 中一样在查询构建器中使用 DATEDIFF。

    可用功能:

    MySQL:

    ACOS, AES_DECRYPT, AES_ENCRYPT, ANY_VALUE, ASCII, ASIN, ATAN, ATAN2, BINARY, BIT_COUNT, BIT_XOR, CEIL, CHAR_LENGTH, COLLATE, CONCAT_WS, CONVERT_TZ, COS, COT, COUNTIF, CRC32, DATE, DATE_FORMAT, DATEADD, DATEDIFF, DATESUB, DAY, DAYNAME, DAYOFWEEK, DAYOFYEAR, DEGREES, DIV, EXP, EXTRACT, FIELD, FIND_IN_SET, FLOOR, FROM_UNIXTIME, GREATEST, GROUP_CONCAT, HEX, HOUR, IFELSE, IFNULL, LAST_DAY, LEAST, LOG, LOG10, LOG2, LPAD, MATCH, MD5, MINUTE, MONTH, MONTHNAME, NOW, NULLIF, PI, POWER, QUARTER, RADIANS, RAND, REGEXP, REPLACE, ROUND, RPAD, SECOND, SECTOTIME, SHA1, SHA2, SIN, SOUNDEX, STD, STDDEV, STRTODATE, STR_TO_DATE, SUBSTRING_INDEX, TAN, TIME, TIMEDIFF, TIMESTAMPADD, TIMESTAMPDIFF, TIMETOSEC, UNHEX, UNIX_TIMESTAMP, UTC_TIMESTAMP, UUID_SHORT, VARIANCE, WEEK, WEEKDAY, YEAR, YEARWEEK
    

    甲骨文

    DAY, LISTAGG, MONTH, NVL, TO_CHAR, TO_DATE, TRUNC, YEAR
    

    Sqlite

    DATE, MINUTE, HOUR, DAY, WEEK, WEEKDAY, MONTH, YEAR, STRFTIME, DATE_FORMAT*, CASE WHEN THEN ELSE END, IFNULL, REPLACE, ROUND
    

    PostgreSQL

    TO_DATE, TO_CHAR, AT_TIME_ZONE, COUNT_FILTER, STRING_AGG
    

    【讨论】:

    • 我喜欢它DoctrineExtensions))
    【解决方案2】:

    我认为您只需一个查询即可完成此操作。看起来像这样:

    $dateThreshold = new \DateTime();
    $dateThreshold->modify("-30 days");
    $qb = $this->createQueryBuilder('add')
        ->delete('add')
        ->where("add.app_id IS NULL")
        ->andWhere("add.updated_at <= :date_threshold")
        ->setParameter("date_threshold", $dateThreshold)
        ->getQuery()->execute()
    

    我不熟悉您的数据库结构,但您应该从上面的示例中了解。

    【讨论】:

      【解决方案3】:

      谢谢你们!我刚刚修改了我的查询,它起作用了! 我必须记住您将 SQL 函数添加到 Doctrine 的技巧:)

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        相关资源
        最近更新 更多