Ich arbeite an einer kleinen Übung, um mich mit Symfony 3 zu verbessern. Ich habe einen Fehler beim Erstellen einer Abfrage, um Anzeigen zu erhalten, die nicht mit Anwendungen verknüpft sind und auf denen das Datum älter als 30 Tage ist.Symfony Abfrage mit Doctrine
Ich habe eine neue Methode in meinem Controller erstellt, eine neue Abfrage in meinem AdvertRepository und einen Dienst namens "Purger", in dem ich diese alten Anzeigen löschen muss.
ich fügen Sie den Code direkt unter (Controller, Serviceklasse, 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"
Ich habe versucht, etwas mit der date_diff function() in der gleichen Abfrage mit Querybuilder zu tun, aber es war ein Fehler, weil queryBuilder() diese Funktion nicht als CURRENT_DATE() kennt. Ich denke, ich habe versucht, es mit zwei verschiedenen Abfragen arbeiten zu lassen (eine mit queryBuilder und eine mit der DQL-Sprache).
Wirklich danke für die Hilfe!