Dział: Strona główna » Blog » Obsługa funkcji daty w Symfony2 (2.2),
Zaloguj Kontakt Strona główna

Obsługa funkcji daty w Symfony2 (2.2),

czyli coś, czego brakuje

Pisząc dodatek bloga do biegania, chciałem żeby można było wyświetlić dodatkowo aktywności tylko np. z danego miesiąca lub konkretnego roku. Domyślnie Doctrine2 nie obsługuje funkcji takich jak YEAR(), MONTH(), DAY().

Po małym grzebaniu w sieci znalazłem wreszcie rozwiązanie, które mnie zadowala. Wymaga ono doinstalowania DoctrineExtensions do naszego projektu.

Poniżej wymagane zmiany.

# composer.json
    "require": {
        "beberlei/DoctrineExtensions": "dev-master"
    },
 $em = $this->getDoctrine()->getManager();

 $emConfig = $em->getConfiguration();
 $emConfig->addCustomDatetimeFunction('YEAR', 
                    'DoctrineExtensions\Query\Mysql\Year');
 $emConfig->addCustomDatetimeFunction('MONTH', 
                    'DoctrineExtensions\Query\Mysql\Month');
 $emConfig->addCustomDatetimeFunction('DAY', 
                    'DoctrineExtensions\Query\Mysql\Day');

 $qb = $em->createQueryBuilder('a')
    ->select('a')
    ->from('nSoftRunningBundle:Activity','a')
    ->where('YEAR(a.date) = :year')
    ->andWhere('MONTH(a.date) = :month')
    ->setParameter('year', $year)
    ->setParameter('month', $month)
    ->getQuery();
 $result = $qb->getResult();

Prosty zabieg, a oszczędza wiele pracy.

  • Autor: Łukasz Buryło
Comment icon

Komentarze

  1. Avatar

    No i gitara. Mi jeszcze w sumie takie "sortowanie" nie było potrzebne, ale biorąc pod uwagę same możliwości Doctrine wystarczyło by w modelu danej tabeli dać coś takiego:

    getDate($year,$month) {
    $wpisy = $this->getInstance()->getQueryObject()->where("YEAR('date') = ?",$year)->andWhere("MONTH('date') = ?",$month)->execute();
    if($wpisy->count() > 0){
    return $wpisy;
    } else {
    return false;
    }
    }

    O ile nasza kolumna z datą zwie się 'date' powinniśmy otrzymać zwrotnie obiekt z elementami spełniającymi nasze kryteria. Zapis z if'em najprawdopodobniej jest zbędny ale nie pamiętam dokładnie przy których założeniach w doctrine był błąd i zwrotnie na brak elementów dostawaliśmy całą tablicę.

    Dodano: 28.04.2013
    Przez: ~ Kacper ~
  2. Avatar

    Prawdę mówiąc nie spodziewałem się, że będzie potrzebny jakikolwiek zabieg żeby móc skorzystac z funkcji YEAR(), MONTH() itp.

    Dodano: 28.04.2013
    Przez: ~ Łukasz Buryło ~
  3. Avatar

    Być może w SF2 jest taka konieczność, ja w sumie na 1.4 utknąłem a czasu brak by się nowych założeń symfony uczyć. Ty z 1.4 na 2 przeszedłeś, czy od 2 się uczyłeś korzystania z sf? Ogólnie zauważyłem, że zrobili wielką rewolucję z SF między 1 a 2, przez co SF do Zenda podobne jest. Są gusta i guściki, ale mi to przejście się średnio podoba :P

    Dodano: 28.04.2013
    Przez: ~ Kacper ~
  4. Avatar

    1.4 znałem z grubsza, konkretniejsza zabawę zacząłem od 2.0
    Faktem jest, że róznica pomiędzy 1.4 a 2.0 jest ogromna przez co SF stał się bardzo podobny do ZF. Widoczne są różnice nawet pomiędzy 2.0 2.1 2.2, ale mam nadzieję, że w pewnym momencie się zatrzymają jak było z 1.4 bo teraz każda zmiana wersji to poprawki w kodzie. Początkowo byłem bardzo mocno sceptyczny jeśli chodzi o używanie SF, ale po paru projektach przekonałem się ile czasu można oszczędzić :)

    Dodano: 28.04.2013
    Przez: ~ Łukasz Buryło ~
  5. Avatar

    między SF 1.1-1.4 z każdą wersją wchodziły poprawki - różnice w funkcjach i dodawanie nowych, przez co 100 linijek kodu można było 3 zastąpić. Main'y dużo się od siebie nie różniły, głównie poprawki w bezpieczeństwie i drobne błędy. Do 2 podejdę jak znajdę czas i chętnie się wypowiem. Po pierwszych 6 miesiącach z SF stwierdziłem, że dla mnie PHP nie istnieje bez tego frameworka i w sumie nie wyobrażam sobie w tym momencie korzystania z query mysql'owych bez obiektów.
    PS. zrób konta na blogu, jakiegoś oAuth'a (najlepiej googlowskiego).

    Dodano: 02.05.2013
    Przez: ~ Kacper ~
  6. Avatar

    Pefecrt shot! Thanks for your post!

    Dodano: 18.09.2013
    Przez: ~ Danyon ~
  7. Avatar

    Czy można korzysać z DATE/YEAR/DAY itd w groupBy np. ->groupBy('DATE(u.dateLogin)')

    Dodano: 21.07.2014
    Przez: ~ Paweł ~