CRUD “Produit”

Test : prendre le fichier ressource et tester la route app_dev.php/test2fini/Produit

création d’un Bundle pour faire un essai

php bin/console generate:bundle --namespace=test2crudBundle  --no-interaction --format=annotation

Nom du Bundle : test2crudBundle (laisser les options par défaut : dossier src pour les sources, les routes sont définies avec les annotations).

test2crud:
    resource: "@test2crudBundle/Controller/"
    type:     annotation
    prefix:   /test2

création du contrôleur

Appels des vues

Dans les vues, faire référence au Bundle (c’est obligatoire) :

test

utilisation de l’ORM

créer un table sur MYSQL

Il faut commencer par générer une entité

Pour créer une entité :

php bin/console generate:doctrine:entity

Nom de l’entité : test2crudBundle:sproduits avec les annotations, ( l’identifiant (de nom id) est généré par défaut)

- typeProduit_id : integer
- nom : string (255)
- prix : float
- photo : string (255)
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'salade', '2.00','salade.jpeg');
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'choux', '2.50','choux.jpeg');
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'pomme de terre', '1.50','pommeterre.jpeg');
INSERT INTO sproduits (`id`, `type_produit_id`, `nom`, `prix`,`photo`)VALUES (NULL, 1, 'tomate', '1.50','tomate.jpeg');

Pour les rapides : il est possible d’utiliser des fixtures pour remplir la base de données (très utile pour un projet à plusieurs car les données sont partagées sur github) http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

php bin/console generate:doctrine:entity --no-interaction --entity=test2crudBundle:sproduits --format=annotation --fields=" typeProduit_id:integer nom:string(255) prix:float photo:string(255)"

Lecture des données dans la table ‘sproduits’ avec l’orm

use test2crudBundle\Entity\sproduits;
$instanceRepositorySproduit = $this->getDoctrine()->getManager()->getRepository("test2crudBundle:sproduits");
$produits = $instanceRepositorySproduit->findAll();

Ajout d’un enregistrement

Définir un objet de type sproduits , mettre les attributs aux bonnes valeurs avec les setter (la classe sproduits a été importée lors de la dernière étape)

$produit = new sproduits();

$produit->setNom($donnees['nom']);
$produit->setPrix($donnees['prix']);
$produit->setPhoto($donnees['photo']);
$produit->setTypeProduitId($donnees['typeProduit_id']);

Persister les données (enregistrer dans la base)

    // On récupère l'EntityManager
$em = $this->getDoctrine()->getManager();
    // Étape 1 : On « persiste » l'entité
$em->persist($produit);
    // Étape 2 : On « flush » tout ce qui a été persisté avant
$em->flush();

modification des données d’un enregistrement

Il faut récupérer l’identifiant

$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $id));
var_dump($produit);
die();
$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $donnees['id']));

$produit->setNom($donnees['nom']);
$produit->setPrix($donnees['prix']);
$produit->setPhoto($donnees['photo']);
$produit->setTypeProduitId($donnees['typeProduit_id']);
$em = $this->getDoctrine()->getManager();
$em->persist($produit);
$em->flush();

supprimer un enregistrement

$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $id));
$em = $this->getDoctrine()->getManager();
$produit = $em->getRepository('test2crudBundle:sproduits')->findOneBy(array('id' => $id));
$em->remove($produit);
$em->flush();

table typeProduits

php bin/console generate:doctrine:entity  --no-interaction --entity=test2crudBundle:stypeProduits --format=annotation --fields="libelle:string(255)" 
php bin/console doctrine:schema:update --dump-sql
php bin/console doctrine:schema:update --force
INSERT INTO stype_produits (id, libelle) VALUES
(1, 'type 1'),
(2, 'type 2'),
(3, 'type 3');
        $instanceRepositoryStypeproduit = $this->getDoctrine()->getManager()->getRepository("test2crudBundle:stypeProduits");
        $typeProduits=$instanceRepositoryStypeproduit->findAll();

Ce code ne semble pas utile avant la définition du contrôleur

use test2crudBundle\Entity\stypeProduits;

Utiliser le dossier Repository

    public function getProduits(){
//        http://symfony.com/doc/current/doctrine/associations.html#joining-related-records
//        $query = $this->getEntityManager()
//            ->createQuery("SELECT p.id, t.libelle, p.nom, p.prix, p.photo
//                            FROM test2crudBundle:sproduits as p
//                            JOIN test2crudBundle:stypeProduits as t
//                            WHERE p.typeProduit_id=t.id
//                            ORDER BY p.nom");
//
//        return $query->getResult();


        $qb=$this->createQueryBuilder('p'); // il lui faut une lettre, i : item en base de données donc schéma
        $qb->select('p.id', 't.libelle', 'p.nom', 'p.prix', 'p.photo')
            ->join( 'test2crudBundle:stypeProduits', 't')
            ->where('p.typeProduit_id=t.id')
            ->addOrderBy('p.nom', 'ASC');
        return $qb->getQuery()->getResult();
    }
$produits = $this->getDoctrine()
    ->getRepository('test2crudBundle:sproduits')
    ->getProduits();

relation

ManyToOne

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony2/les-relations-entre-entites-avec-doctrine2#/id/r-2315858

Déclaration de la relation dans la bonne entité (entity : sproduits)

    /**
     * @var int
     *
     * @ORM\Column(name="type_produit_id", type="integer")
     */
    /**
     * @ORM\ManyToOne(targetEntity="stypeProduits")
     * @ORM\JoinColumn(name="typeProduit_id", referencedColumnName="id")
     */

Utilisation dans les vues (twig)

{{produit.typeProduitId.libelle}}
php bin/console doctrine:schema:update --dump-sql
php bin/console doctrine:schema:update --force