Come prelevare facilmente i dati da un database con Symfony e Doctrine.
1. Creiamo il DB da phpMyAdmin
Name: test_project
Codifica caratteri: utf8mb4_bin
Creiamola tabella: product
– Id integer auto increment
– name char lenght=100
– price decimal scale=2 (10,2)
– description text
NB: phpMyAdmin a volte non imposta correttamente 10,2 convertendolo in automatico in 10,0, in questo caso selezionare il tab SQL e digitale
ALTER TABLE `product` CHANGE `price` `price` DECIMAL(10,2) NOT NULL;
Inseriamo dei prodotti
2. Creiamo la Entity Product in src/AppBundle/Entity/Product.php
Notare che le proprietà di questa classe saranno public o non riuscirò ad accedervi per visualizzare il Fetch del DB.
<?php // src/AppBundle/Entity/Product.php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="product") */ class Product { // ------------------------------------------------------------------------- // Proprietà --------------------------------------------------------------- // ------------------------------------------------------------------------- /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ public $id; /** * @ORM\Column(type="string", length=100) */ public $name; /** * @ORM\Column(type="decimal", scale=2) */ public $price; /** * @ORM\Column(type="text") */ public $description; // ------------------------------------------------------------------------- // Metodi ------------------------------------------------------------------ // ------------------------------------------------------------------------- public function getId() // ottieni { return $this->id; // assegna il valore che proviene dall'istanza $this-> } public function setId($id) // setta { $this->id = $id; } // ------------------------------------------------------------------------- public function getName() // ottieni { return $this->name; // assegna il valore che proviene dall'istanza $this-> } public function setName($name) // setta { $this->name = $name; } // ------------------------------------------------------------------------- public function getPrice() // ottieni { return $this->price; // assegna il valore che proviene dall'istanza $this-> } public function setPrice($price) // setta { $this->price = $price; } // ------------------------------------------------------------------------- public function getDescription() // ottieni { return $this->description; // assegna il valore che proviene dall'istanza $this-> } public function setDescription($description) // setta { $this->description = $description; } }// end class Product
3. Creiamo il Controller in src/AppBundle/Controller/LoadProduct.php
<?php // src/AppBundle/Controller/LoadProduct.php namespace AppBundle\Controller; use AppBundle\Entity\Product;// Product.php che ho creato io use Symfony\Bundle\FrameworkBundle\Controller\Controller; // il bundle controller Symfont use Symfony\Component\HttpFoundation\Response; // namespace di Symfony per response() use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;// namespace per utilizzare @Route class LoadProduct extends Controller { /** * @Route("/loadproduct") */ public function createAction() { echo ('Carica dal DB'); // metodo di Doctrine getRepository('AppBundle/Entity/Product.php') -> shortcut -> ('AppBundle:Product') // crea lo schema dell'oggetto $repository = $this->getDoctrine()->getRepository('AppBundle:Product'); // cerca per il prezzo - findByNomevariabile(valore) - $productExtracted = $repository->findByPrice(12.99); var_dump($productExtracted); // renderizza l'array di oggetti creato // renderizza tutto il contenuto dell'array di oggetti for ($i = 0; $i < count($productExtracted); $i++)// conteggia tutto il contenuto { echo $i . " " . ($productExtracted[$i]->name) . "<br>"; } // send var to a template... return new Response( 'End of the Script' ); }// END createAction() }// END class Saveproduct
Come funziona?
1. Per utilizzare il DB dobbiamo avere una Entity che fornisca a Symfony uno schema sul quale creare le query.
metodo di Doctrine getRepository(‘AppBundle:Product’) -> che è l’equivalenmte di -> getRepository((‘AppBundle/Entity/Product.php’)
$repository = $this->getDoctrine()->getRepository('AppBundle:Product');
2. Ora basta lanciare le query con la sintassi findByNomevariabile(valore) dove findBy è la keyword
$productExtracted = $repository->findByPrice(12.99);
$productExtracted = un array di oggetti, gli oggetti sono le singole colonne del database
3. Renderizza
Carica dal DB C:\wamp64\www\symfonytest\first_test_symfony\src\AppBundle\Controller\LoadProduct.php:26: array (size=2) 0 => object(AppBundle\Entity\Product)[307] public 'id' => int 36 public 'name' => string 'USB Pen Sandisk' (length=15) public 'price' => string '12.99' (length=5) public 'description' => string 'Ergonomic and stylish!' (length=22) 1 => object(AppBundle\Entity\Product)[309] public 'id' => int 30 public 'name' => string 'USB Pen Kingston' (length=16) public 'price' => string '12.99' (length=5) public 'description' => string 'Ergonomic and stylish!' (length=22) 0 USB Pen Sandisk 1 USB Pen Kingston End of the Script