2017-11-30 3 views
0

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!

Antwort

0

Ich denke, Sie können dies in nur einer Abfrage tun. Welche würden sieht smt wie folgt aus:

$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() 

ich mit Ihrem db Struktur nicht vertraut bin, aber Sie sollten eine Idee frmo Beispiel oben erhalten.

0

Um DATEDIFF Funktion (oder andere) verwenden Sie Lehre Erweiterung installieren:

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

und in Ihrem config.yml:

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

können Sie jetzt Verwenden Sie DATEDIFF in Ihrem Abfrage-Generator wie in SQL.

Funktionen zur Verfügung:

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 

Oracle

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 

PostgreS QL

TO_DATE, TO_CHAR, AT_TIME_ZONE, COUNT_FILTER, STRING_AGG 
0

Danke Jungs! Ich habe meine Anfrage geändert und es hat funktioniert! Ich muss Ihren Trick über das Hinzufügen von SQL-Funktionen zu Doctrine im Gedächtnis behalten :)