Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Doctrine e Symfony2: lettura, aggiornamento e cancellazione dei dati

Utilizzando lo schema CRUD scopriamo le procedure richieste per leggere i dati presenti nella tabella di un database, estrarre oggetti, aggiornare record e cancellare dati utilizzando l'ORM Doctrine e il framework PHP Symfony2.
Utilizzando lo schema CRUD scopriamo le procedure richieste per leggere i dati presenti nella tabella di un database, estrarre oggetti, aggiornare record e cancellare dati utilizzando l'ORM Doctrine e il framework PHP Symfony2.
Link copiato negli appunti

Leggere un contenuto dal database

Una volta che abbiamo inserito il nostro oggetto nel database, possiamo recuperarlo e mostrarne le informazioni in una pagina ad esso dedicata. Per fare questo creiamo il metodo view con il seguente listato:

public function viewAction( $id )
{
    $book = $this->getDoctrine()
                 ->getRepository('AcmeDemoBundle:Book')
                 ->find($id);
    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
        )
    );
}

Anche in questo caso l'operazione è molto semplice. Per prima cosa richiamiamo il repository da Doctrine e poi invochiamo su di esso il metodo find con l'id del libro richiesto.

Il repository è una classe che ci aiuta ad effettuare operazioni su un determinato oggetto. In questo caso ci aiuta a recuperare le informazioni del libro attraverso il metodo find.

In realtà avremmo potuto recuperare il libro anche attraverso gli altri suoi campi, questo grazie i metodi magici che vengono gestiti automaticamente. Supponiamo quindi di voler recuperare il libro dal suo titolo, in tal caso avremmo potuto eseguire la seguente istruzione:

$book = $this->getDoctrine()
              ->getRepository('AcmeDemoBundle:Book')
              ->findOneByTitle("Il Signore degli Anelli");

Il metodo findOneByTitle non lo abbiamo creato noi ma attraverso i metodi magici di PHP, Doctrine automaticamente andrà a cercare all'interno del campo title.

Una volta recuperato il libro, andiamo quindi a visualizzare i dati all'interno del file view.html.twig:

<h1>Informazioni sul libro richiesto</h1>
<p>Di seguito i dati del libro richiesto:</p>
<table>
    <tbody>
        <tr>
            <th>Titolo</th>
            <td>{{ book.title }}</td>
        </tr>
        <tr>
            <th>Autore</th>
            <td>{{ book.author }}</td>
        </tr>
        <tr>
            <th>ISBN</th>
            <td>{{ book.isbn }}</td>
        </tr>
        <tr>
            <th>Descrizione</th>
            <td>{{ book.description }}</td>
        </tr>
        <tr>
            <th>Prezzo</th>
            <td>{{ book.price }}</td>
        </tr>
    </tbody>
</table>

Recuperare una lista di oggetti dal database

Supponiamo di visualizzare la lista dei libri contenuti all'interno del database, se avessimo effettuato la query manualmente avremmo lanciato un'istruzione del tipo SELECT * FROM book. Vediamo con Doctrine come eseguire l'operazione:

public function indexAction()
{
    $books = $this->getDoctrine()
                 ->getRepository('AcmeDemoBundle:Book')
                 ->findAll();
    return $this->render(
        'AcmeDemoBundle:Book:index.html.twig',
        array(
            'books' => $books
        )
    );
}

Abbiamo utilizzato il metodo findAll() che si occupa di recuperare tutte le entry contenute nel database.

Se volessimo filtrare i dati in base ad un parametro potremmo, invece, utilizzare il metodo findBy:

$books = $repository->findBy(
    array('author' => 'John Ronald Reuel Tolkien'),
    array('price' => 'ASC')
);

Con il codice appena visto recuperiamo tutti i libri di Tolkien ordinandoli per prezzo ascendente.

A questo punto possiamo ciclare i libri presenti nel database e mostrarli nella pagina index.html.twig:

<h1>I miei libri</h1>
{% if books is not empty %}
<table>
    <thead>
    <tr>
        <th>Titolo</th>
        <th>Autore</th>
        <th>ISBN</th>
        <th>Descrizione</th>
        <th>Prezzo</th>
    </tr>
    </thead>
    <tbody>
    {% for book in books %}
    <tr>
        <td>{{ book.title }}</td>
        <td>{{ book.author }}</td>
        <td>{{ book.isbn }}</td>
        <td>{{ book.description }}</td>
        <td>{{ book.price }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>
{% else %}
    <p>Nessun libro trovato</p>
{% endif %}

Aggiornare un elemento del database

L'update è un insieme di operazioni e metodi già visti in precedenza:

public function updateAction()
{
    $id = 1;
    $em = $this->getDoctrine()->getManager();
    $book = $em->getRepository('AcmeDemoBundle:Book')->find($id);
    if (!$book) {
        throw $this->createNotFoundException(
            'Nessun libro presente nel database con l\'id '.$id
        );
    }
    $book->setPrice('25.00');
    $em->flush();
    return $this->render(
        'AcmeDemoBundle:Book:view.html.twig',
        array(
            'book' => $book
        )
    );
}

Per aggiornare un elemento nel database è sufficiente recuperarlo, utilizzare i metodi setter su di esso e richiamare il flush() al termine delle operazioni.

Eliminare un elemento dal database

Anche l'eliminazione degli elementi risulta essere un'operazione molto veloce:

public function deleteAction()
{
    $id = 1;
    $em = $this->getDoctrine()->getManager();
    $book = $em->getRepository('AcmeDemoBundle:Book')->find($id);
    if (!$book) {
        throw $this->createNotFoundException(
            'Nessun libro presente nel database con l\'id '.$id
        );
    }
    $em->remove($book);
    $em->flush();
    return $this->redirect($this->generateUrl('_book'));
}

In questo caso prima del metodo flush() richiamiamo il metodo remove().

Nelle ultime due lezioni ci siamo occupati di accedere al database, creare tabelle ed eseguire query senza aver scritto una sola riga di codice SQL. Tutto questo grazie a Symfony ma soprattutto a Doctrine. Le potenzialità del framework e del'ORM, però, non finiscono qui e scopriremo nella prossima lezione come creare relazioni tra tabelle e query più complesse attraverso il binomio Symfony/Doctrine.

Ti consigliamo anche