Wpis z mikrobloga

Mirki, mam #pytanie do #symfony2 #php #angularjs - po raz drugi, bardziej sprecyzowane ( ͡ ͜ʖ ͡)

- Mam sobie listę złożonych wniosków w panelu admina w różnych kategoriach
- Obok każdej kategorii chcę umieścić liczbę NOWYCH, nie rozpatrzonych przez admina wniosków

Wszystko to jest oparte na AngularJS, więc w Symfony jest to REST API.

I teraz nie wiem jak tą liczbę nowych wniosków wykonać.
Czy:
- wysyłać nowy request do API z liczbą nowych wniosków w danej kategorii (trochę głupie, nawet bardzo)
- wysyłać to do Angulara razem z obiektem kategorii, czyli np.
category_name: Sport
nierozpatrzone: 14

Ten drugi sposób uważam za bardziej poprawny, więc:
- jak wykonać to od strony Symfony, tj. w encji z kategorią wniosków dodać pole unread (które będzie bez adnotacji @ORM, czyli bez odzwierciedlenia w bazie) i później po pobraniu kategorii przepuścić je przez foreach i dopisać do tego pola "unread" liczbę nierozpatrzonych wniosków ? ( ͡ ͜ʖ ͡) Januszowe bardzo, tak więc nie wiem w jaki sposób to rozwiązać :(
  • 53
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@MacDada: to z FOSRestBundle, zwraca do przegladarki zserializowane $events. Jestem na takim etapie programowania, że jeszcze testów nie piszę - jakoś ogólnie wydają mi się niepotrzebne.

@Jurigag: [Semantical Error] line 0, col 85 near 'FROM AppBundle:Event': Error: Class 'FROM' is not defined.(,)
Kod:
$query = $em->createQueryBuilder()
->select('a,(SELECT
  • Odpowiedz
latanie po całej tablicy szybkie? XD


@Jurigag: Tak, bardzo szybkie. Nawet jak masz kilkaset wartości, to mikrosekundy.

A jak pojawiłby się problem, że jednak tych rekordów jest bardzo dużo, to można zoptymalizować przez
  • Odpowiedz
@Spake: Nie wiem jak tam się robi te różne magie w FOSRestBundle, ale popatrz na mój poprzedni komentarz – możesz to sobie zliczyć metodą w obiekcie kategorii. Więc chyba podczas serializacji możesz powiedzieć, żeby użył sobie tej metody przy zwracanych danych.
  • Odpowiedz
jeszcze testów nie piszę - jakoś ogólnie wydają mi się niepotrzebne


@Spake: Mnie wiele nauczyły jaki kod jest dobry a jaki kiepski – jeśli trudno się kod testuje, to raczej jest kiepski i zmusza mnie to do szukania „jak zrobić lepiej”.

Stąd mocno polecam: nie tylko, żeby mieć pewność wobec swojego kodu przy przyszłych zmianach, ale też dla samorozwoju jako programisty.
  • Odpowiedz
@MacDada: Dobra, dzięki, to na dniach sobie poczytam o testach ( ͡° ͜ʖ ͡°)
@Jurigag: Wielkie dzięki, ogarnąłem już to zapytanie i tak zrobiłem, dzięki ! Jeszcze jedno pytanko - da się zrobić tak, aby nie
  • Odpowiedz
@MacDada: jakie rzeźbienie dqlami, to rozwiązałem które podałem jest najszybsze, w dodatku jak ma rest api to tutaj wszędzie będzie miał zwracane w twoim przypadku PEŁNE OBIEKTY, nie wiem na h-j mu one, @Spake: zamień getResult() na getArrayResult(), pozbędziesz się zbędnej hydracji do obiektów, jeszcze lepiej zapoznaj się ze słówkiem kluczowym partial w doctrine
  • Odpowiedz
@Spake: chyba raczej nie, tak działa mapper w doctrine, dla mnie to o wiele lepsze rozwiązanie niż doklejane jako kolumna w ostatniej encji, przecież to jakaś głupota, czemu akurat w ostatniej a nie np 4 ? XD
  • Odpowiedz
@Jurigag: obojętnie w której. Chodzi o to, że w AngularJS jak będę ten obiekt chciał zmodyfikować i zrobić PUT, to mi zwróci obiekt jako event[] + count, zamiast samego event. I API mi tego nie przyjmie, ogólnie to nie jest według zasad REST
  • Odpowiedz
@Spake: a co to są zasady rest, nic one nie mówią że obiekty mają być zwracane tak a nie inaczej ? po prostu ogarnij sobie w angularze aby zwracał z tego żeby brał tą pierwszą tablicę, co za problem ? xd nie wiem jak to masz w angularze, ja mam takie api i angulara i nie mam zadnego problemu
  • Odpowiedz
to rozwiązałem które podałem jest najszybsze


@Jurigag: Nie twierdzę że nie. Twierdzę, że może szybkość nie jest priorytetem i można to napisać w oderwaniu od frameworka => co w większości przypadków jest preferowanym rozwiązaniem.

Jeśli szybkość jest takim priorytetem, to może w ogóle olać Doctrine, Symfony i jakieś Bundle? Utworzyć dedykowany plik, routing na nginx'ie, mysqli_query i śmiga 10 razy
  • Odpowiedz
@MacDada: no okej, tylko że to nie jest akurat premature optimization, to co napisałem ma spory wpływ na czas zapytań akurat, przeciż po wywaleniu hydracji do obiektów i dodaniu partiali to to zapytanie będzie szybciej chodzić, a co za tym idzie i testy @Spake: na 100% da się jakoś zrobić to, szukaj na stacku albo gdzieś, a jak się nie da to korzystaj dalej z takich gówien które
  • Odpowiedz
tylko że to nie jest akurat premature optimization, to co napisałem ma spory wpływ na czas zapytań akurat


@Jurigag: Pozbycie się Symfony i Doctrine będzie miało jeszcze większy wpływ na czas, a jednak tego nie robisz…

Moim zdaniem to jest premature optimization. Napisz to „możliwie najlepiej” pod względem „jakościowym” (czyli testowalne, w oderwaniu od fw, etc). Sprawdź czy zamula na tyle, że zmuszony jesteś optymalizować. Wtedy optymalizuj.

Ale jeśli z
  • Odpowiedz
@MacDada: jest, wydajność w doctrine ZAWSZE jest problemem, miałem do czynienia z tym u siebie w projekcie i nawet na najprostszych obiektach i query głupie getArrayResult() przyspieszało request 2-3x
  • Odpowiedz
@Jurigag: Ogólnie: robię duże appki i większość kodu piszę bez patrzenia na wydajność. Dopiero na koniec dorzucam jakieś kesze. I dopiero jak widzę, że jest problem, to nawet właśnie wydzielenie takiego pliku poza frameworkiem się zdarza.

Bardzo rzadko z góry kombinuję nad hackami optymalizacyjnymi – bo pomimo że appka jest intensywnie użytkowana i ma miliony rekordów w niektórych tabelkach, to generalnie wydajność jest satysfakcjonująca i wolę się skupić na jakości
  • Odpowiedz