ugrás a tartalomhoz

symfony2, doctrine2, generált id elérése

dbedo · 2011. Aug. 21. (V), 16.46
Sziasztok!

Symfony2/Doctrine/MySql problémám adódott.

Van egy Question entitym 'id', 'created_at' és egyéb nem lényeges attribútumokkal. Egy Question egy felhasználó által feltehető kérdést tartalmaz. Szeretnék a kérdésekhez egy 'slug' attribútumot is eltárolni, ami egy az id és created_at mezőkből álló URL-hez használt stringet tartalmazna pl: '2011-08-21-3214' , amennyiben ez a mai napon került felvitelre és a 3214 es id-je van az adatbázisban.

A slug generálását megtehetném a prePersist esemény lefutásakor, de ekkor még nem ismert, hogy mi lesz a rekord id-je, esetleg a postPersist-ben - ekkor már ismert - de a mentés után nyilván már késő.

A kérdésem tehát az volna, hogy van-e valami ötletetek, esetleg máshogy kéne megközelítenem a problémát.

Köszönöm!
 
1

Muszáj még egyszer eltárolni

Hidvégi Gábor · 2011. Aug. 21. (V), 16.57
Muszáj még egyszer eltárolni ezt az értéket? Mindkét eredeti adat (id és dátum) folyamatosan a rendelkezésedre fog állni.
3

Igen, azt hiszem mindenképp

dbedo · 2011. Aug. 21. (V), 17.59
Igen, azt hiszem mindenképp célszerű.
Ugyan rendelkezésre áll mindkét mező, de akárhányszor meg akarom valahol jeleníteni a linket, akkor generálni kéne a slug-ot, valamint a slug alapján rekord visszakeresés is sokkal lassabb, ha nincs eltárolva.
5

Egy szimpla UPDATE-tel nagyon

Hidvégi Gábor · 2011. Aug. 21. (V), 18.09
Egy szimpla UPDATE-tel nagyon könnyen meg lehet oldani a problémát, de, gondolom, te inkább a keretrendszer beépített funkcióival szeretnéd?
6

Hm, nem ment el az előző

dbedo · 2011. Aug. 21. (V), 18.33
Hm, nem ment el az előző válaszom.
Szóval igen, nem rajongok az updateért, mert akkor egy rekord beszúrásához 2 adatbázisművelet kell, de ha nincs más megoldás, akkor ezt valahogy szeretném a doctrine keretein belül megoldani, ne kelljen a controllerben, vagy akárhol máshol még valamit meghívni hozzá.

Van mondjuk a doctrine entityknek egy postPersist eseménye is, amiben már le tudnám generálni ezt a slug mezőt az id alapján, mert ez pont a beszúrás után fut le, de nem tudom mennyire szép dolog, innen - az entitáson belülről - elérni az entity managert, ami az objektumok eltárolását végzi és szólni, hogy most "magamat" updatelni kéne.
7

Szerintem nem nagyon lehet

Hidvégi Gábor · 2011. Aug. 21. (V), 18.39
Szerintem nem nagyon lehet ezt megoldani egy adatbázisművelettel, ha a slugot is el szeretnéd tárolni a táblában.
10

én most ismerkedem

blabla · 2012. Okt. 10. (Sze), 13.40
Hello

Én most ismerkedem a Symfony2-vel és azon belül ezzel a Doctrinnel. A példaoldalon azonban feltűnt nekem pontosan az, amit te is említesz, hogy ott 2 adatbázis művelettel update-el a rendszer, hiszen először visszakéri a recordot, majd jön a tulajdonképpeni update (példa innen http://symfony.com/doc/current/book/doctrine.html). Ezt miért így kell? Egy sima update művelettel meg lehetne oldani, nem? Használjam a Doctrine-t vagy sem a symfony2-höz? Tudom egyáltalán a doctrine-t mellőzni a symfony2-ben?

public function updateAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $product = $em->getRepository('AcmeStoreBundle:Product')->find($id);

    if (!$product) {
        throw $this->createNotFoundException('No product found for id '.$id);
    }

    $product->setName('New product name!');
    $em->flush();

    return $this->redirect($this->generateUrl('homepage'));
}
2

Én az id-t nem raknám bele a

Protezis · 2011. Aug. 21. (V), 17.48
Én az id-t nem raknám bele a slugba, hanem helyette valami beszédesebb mezőt választanék. Valamint miért nem használod ezt: http://gediminasm.org/article/sluggable-behavior-extension-for-doctrine-2
4

Sajnos nincs beszédesebb

dbedo · 2011. Aug. 21. (V), 18.05
Sajnos nincs beszédesebb mező, sem cím, sem szöveg. Csak a dátum maga pedig feltehetőleg nem egyedi.
Azon persze lehet vitatkozni, hogy a domain.com/question/2011-08-21-3242 szebb-e, mint a domain.com/question/3242 , de szeretném, ha benne lenne az url-ben a dátum is.

Amikor lehet, akkor a fent linkelt extensiont használom, de az sajnos csak string típusú attribútum(ok)ból tud slugot gyártani, se Id, se DateTime nem jó neki, InvalidMappingExceptiont dob:
Cannot slug field - [created] type is not valid and must be 'string'
8

route

firith · 2011. Aug. 21. (V), 23.09
Szerintem sokkal értelmesebb url lenne ha így használnád:
http://example.org/question/2011-08-21/3214
ekkor használhatod ezt a routingot:

/**
* @Route('/question/{date}/{id}', name="show_question")
*/
public function showAction($id, $date)
{
    //...
    $question = $repository->find($id);

    if (!$question || !$question->getDate() != $date)
        throw $this->createNotFoundException('Unable to find Question entity.');
   
    //...
 
}
de csinálhatsz lekérdezést id-ra és date-re egyszerre
9

Köszi, az url lehet, hogy

dbedo · 2011. Aug. 24. (Sze), 00.10
Köszi, az url lehet, hogy valóban így a legszebb és a megoldás is így egyszerű.

Ha mégis szükségem lenne olyan slugra, amiben az id is szerepel, akkor lehet egy eventet definiálni, ami egy Question objektum létrehozásakor hívódik meg, és ez az event updatelné a slug mezőt. Annyiból szép, hogy doctrinen belül marad az egész, de két lekérdezés és két külön helyen van megvalósítva a Question entitás.
11

Ha mindenképpen tárolni

Práger Ádám · 2012. Okt. 10. (Sze), 16.15
Ha mindenképpen tárolni akarod a slugot, akkor a listener jó megoldás, én is így szoktam.
12

setter

blacksonic · 2012. Okt. 10. (Sze), 22.28
Egy egyszerű setter metódus is csodákra képes :)
13

Ezért megérte hozzászólnod.

dbedo · 2012. Okt. 10. (Sze), 23.27
Ezért megérte hozzászólnod. :) Ugyan a kérdést egy éve tettem fel, de most már kiváncsivá tettél, kérlek fejtsd ki a megoldásod, szeretem a csodákat.
14

csak ha nem kell bele id

blacksonic · 2012. Okt. 11. (Cs), 15.42
Ha nem kell slugba id, akkor kérdés elejéből (pl első 50 karakter) és a létrehozás dátumából az entitás létrehozásakor már egy egész olvasható slugot lehet létrehozni.
A Symblog tutorial oldalán a név átalakítására van egy egész frappáns megoldás, aminek a végére fűzve a dátumot még egy nagy valószínűséggel egyedi slugod lesz.
15

Akkor jol sejtettem, hogy

dbedo · 2012. Okt. 11. (Cs), 16.18
Akkor jol sejtettem, hogy fogalmad sincs a megoldasrol, csak idebofogtel egy "setter csodakra kepes" okossagot. :)
Ha jol emlekszem, doctrinebol a generalt id, ujabb muvelet nelkuli eleresere vonatkozott a kerdes.