【发布时间】: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 语言)。
非常感谢你帮助我!
【问题讨论】: