Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    Symfony 2 Repository personalizzati

    Ciao a tutti non riesco a capire come poter creare Repository personalizzate data la doc. ufficiale.
    Io ho la mia classe Book così definita dopo il createEntity :
    Codice PHP:
    namespace Acme\DemoBundle\Entity;
     
    use 
    Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="book")
     */
    class Book {
     
        
    /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        
    protected $id;
    ........ 
    Symfony mi dice di aggiungere questo commento e di rilanciare la creazione entità
    Codice PHP:
    /**
     * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
     */ 
    Se io inserisco quel commento in questo modo :

    Codice PHP:
    namespace Acme\DemoBundle\Entity;
     
    use 
    Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="book")
     */
    /**
     * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository")
     */
    class Book {
     
        
    /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        
    protected $id;
    ........ 
    E rilancio la creazione entità, il commento mi viene cancellato e basta.
    Symfony invece dice che mi ritrovo la mia classe BookRepository.
    Cosa sbaglio?

    Ciao
    Paolo
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    forse devi fare generate:doctrine:entities ? oppure quando fai generate:doctrine:entity gli dici di creare un repository personalizzato (default mi pare sia no)
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    no io faccio generate:doctrine:entities.
    Ho appena fatto un tentativo ho sostituito :
    /**
    * @ORM\Entity
    * @ORM\Table(name="book")
    */

    Con :

    /**
    * @ORM\Entity(repositoryClass="AppBundle\Entity\Book Repository")
    */

    E mi ha generato la pagine BookRepository.php

    Ma non so se è proprio corretto fare in questo modo, magari mi è andata solo bene.
    Che mestiere difficile.....essere da soli ancora di più

  4. #4
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    """""Doctrine può generare la classe repository per noi, eseguendo lo stesso comando usato precedentemente per generare i metodi getter e setter mancanti:
    $ php app/console doctrine:generate:entities Acme"""""

    Bho evidentemente è cosi che devo fare.
    Che mestiere difficile.....essere da soli ancora di più

  5. #5
    Nel tuo esempio iniziale vedo:
    Codice PHP:
    /** 
     * @ORM\Entity 
     * @ORM\Table(name="book") 
     */ 
    /** 
     * @ORM\Entity(repositoryClass="AppBundle\Entity\ProductRepository") 
     */ 
    Se è cosi, è normale che non ti abbia generato il repository perchè non hai messo una repositoryClass.
    O meglio, l'hai messa ma è la prima riga @ORM\Entity che fà saltare tutto.
    Pensate i programmi a librerie, e innalzate il livello d'astrazione

  6. #6
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    no io faccio generate:doctrine:entities.
    Ho appena fatto un tentativo ho sostituito :
    /**
    * @ORM\Entity
    * @ORM\Table(name="book")
    */

    Con :

    /**
    * @ORM\Entity(repositoryClass="AppBundle\Entity\Book Repository")
    */

    E mi ha generato la pagine BookRepository.php

    Ma non so se è proprio corretto fare in questo modo, magari mi è andata solo bene.
    Ciao è corretto
    Poi devi creare la classe

    "AppBundle\Entity\Book Repository" ed estendere il repository base


    aggiungo che è normale che se generi le entità nuovamente ti elimina quello che inserisci. di default inserisce quella di base.
    Ultima modifica di ciro78; 02-04-2015 a 21:17
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  7. #7
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Quote Originariamente inviata da ciro78 Visualizza il messaggio
    Ciao è corretto
    Poi devi creare la classe

    "AppBundle\Entity\Book Repository" ed estendere il repository base


    aggiungo che è normale che se generi le entità nuovamente ti elimina quello che inserisci. di default inserisce quella di base.
    ahhhhhh forse ho capito....
    Al mio orm\entit dovevo solo aggiungere ciò che c'era in parentesi per cui `repositoryclass......`
    io invece riaggiungendo anche ntity ecc ho incasinato tt...
    domani in officine provo
    Che mestiere difficile.....essere da soli ancora di più

  8. #8
    Non avevo visto il doppio commento @Entity, sicuramente era per quello. Cmq creare BookRepository a mano non è che sia tutta sta cosa complicata senza che ti scomodi ad usare la shell per un solo repo
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Riposto qui perchè la domanda è sempre sui repository personalizzati.
    Sto creando i metodi per effettuare le mie query, ma non riesco a capire che differeza ci sia tra un metodo e un'altro.
    Allora io ho 2 entity.
    book e category.

    Prendiamo come esempio la rotta che espone di dati del libro con la relativa cateogira in JOIN.

    Codice PHP:
        public function viewAction$id )
        {
        
    /*
        //1° test di ricerca
        $book = $this->getDoctrine()
                  ->getRepository('AcmeDemoBundle:Book')
                  ->findOneByTitle("titolo modificato");
            */            

        /*
        //2° test di ricerca
            $book = $this->getDoctrine()
                         ->getRepository('AcmeDemoBundle:Book')
                         ->find($id);
        $categoryName = $book->getCategoryId()->getName();
            if (!$book) {
                throw $this->createNotFoundException(
                    'Nessun libro presente nel database con l\'id '.$id
                );
            }
            return $this->render(
                'AcmeDemoBundle:Book:view.html.twig',
                array(
                    'book' => $book,
            'categoryName' => $categoryName
                )
            );
        */

        //3° test di ricerca
        
    $book $this->getDoctrine()
            ->
    getRepository('AcmeDemoBundle:Book')
            ->
    findOneByIdJoinedToCategory($id);

            
    $category $book->getCategoryId();

            return 
    $this->render(
                
    'AcmeDemoBundle:Book:view.html.twig',
                array(
                    
    'book' => $book,
            
    'category' => $category
                
    )
            );
        } 
    Qui invece i metodi del BookRepository da analizzare

    Codice PHP:
        public function findOneByIdJoinedToCategory($id)
        {
            
    $query $this->getEntityManager()
                ->
    createQuery(
                    
    'SELECT book, cat FROM AcmeDemoBundle:book book
                    JOIN book.category_id cat
                    WHERE book.id = :id'
                
    )->setParameter('id'$id);

            try {
                return 
    $query->getSingleResult();
            } catch (\
    Doctrine\ORM\NoResultException $e) {
                return 
    null;
            }
        } 
    Il 2° test di ricerca fa affidamento ad metodo find (Ho capito che si tratta di un metodo default che effettua la ricerca in base alla chiave che doctrine ha dell'orm, ma mi piacerebbe sapere dove sono questi metodi... ma va be....).
    Comunque prima di passare il tutto alla vista, io devo eseguire il metodo :
    $book->getCategoryId()->getName();
    Per avere il nome almeno il nome della categoria, oppure
    $book->getCategoryId();
    Se voglio avere l'oggetto.

    Cito da documentazione

    "Ovviamente, se si sa in anticipo di aver bisogno di accedere a entrambi gli oggetti, si può evitare la seconda query, usando una join nella query originale. Aggiungere il seguente metodo alla classe ProductRepository:"

    Percui ho costruito il metodo findOneByIdJoinedToCategory che effettua la join.
    Pero devo sempre eseguire il metodo

    $category = $book->getCategoryId();

    Per ottenere i dati della categoria.
    Dove sta il risparmio della query scuate?????
    Che mestiere difficile.....essere da soli ancora di più

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.