Créer un model, la base de données sous magento2

Ce tutoriel est le 6eme d’une longue série de tutoriel magento2. Il sera mis à jour au fur et à mesure des évolutions de la plateforme. Vous allez maintenant apprendre a créer un model pour interagir avec la base de donnée de magento2. Si vous ne connaissez pas magento (v1) ce n’est pas grave, je vais en parler bien sur mais il n’est pas nécessaire de connaître la plateforme magento (v1) pour maîtriser ce tutoriel sur magento2.

Dans le tutoriel précédent nous avons vu Comment ajouter son module à la partie administration (backend) de magento2 ! Nous allons maintenant voir comment ajouter un model et comment interragir avec la base de donnée. Pour cela, on va repartir des fichiers de notre tutoriel précédent.

Créer le Model

Le model c'est la classe qui va vous permettre d’interagir facilement avec votre base de donnée. La classe Contact va représenter l'objet contact avec ses méthodes. Attention, cette classe ne doit pas contenir de SQL directement.
Créez un répertoire Model à la racine de votre module (Pfay/Contacts/Model) et ajoutez le fichier Contact.php avec le contenu suivant :

<?php

namespace Pfay\Contacts\Model;

use Magento\Cron\Exception;
use Magento\Framework\Model\AbstractModel;

/**
 * Contact Model
 *
 * @author      Pierre FAY
 */
class Contact extends AbstractModel
{
    /**
     * @var \Magento\Framework\Stdlib\DateTime
     */
    protected $_dateTime;

    /**
     * @return void
     */
    protected function _construct()
    {
        $this->_init(\Pfay\Contacts\Model\ResourceModel\Contact::class);
    }
    
}

Vous remarquerez que dans le constructeur, on fait un init d'une classe qu'on appellera le ResourceModel

Créer le ResourceModel

Le resourceModel est la classe qui vous permettra de "ranger" vos requettes SQL, elle est utilisée par le Model pour interragir en sql avec la base de donnée.
Créez donc dans votre dossier Model, un dossier ResourceModel avec dans celui-ci une classe Contact.php qui contiendra le code suivant :

<?php

namespace Pfay\Contacts\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

/**
 * Contact Resource Model
 *
 * @author      Pierre FAY
 */
class Contact extends AbstractDb
{
    /**
     * Initialize resource
     *
     * @return void
     */
    public function _construct()
    {
        $this->_init('pfay_contacts', 'pfay_contacts_id');
    }
}

pfay_contacts est le nom de la table que "pfay_contacts" que nous avons crée dans le tutoriel précédent sur les Installer Magento 2. et pfay_contacts_id est la clef primaire de cette table.

Créer la collection

Créeons maintenant la collection. Une collection, c'est ce qui va vous permettre de chercher plusieurs objets dans la base de donnée. En gros si vous créez une collection d'objet, puis vous y ajoutez des filtres qui vous permettrons de ne charger que certains objets de votre table. Nous y reviendrons plus tard.

Dans le dossier ResourceModel, créez le dossier Contact et dans ce dossier, le fichier Collection.php contenant :

<?php

namespace Pfay\Contacts\Model\ResourceModel\Contact;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

/**
 * Contact Resource Model Collection
 *
 * @author      Pierre FAY
 */
class Collection extends AbstractCollection
{
    /**
     * Initialize resource collection
     *
     * @return void
     */
    public function _construct()
    {
        $this->_init('Pfay\Contacts\Model\Contact', 'Pfay\Contacts\Model\ResourceModel\Contact');
    }
}

Créer un contact à partir de mon Model

Pour tester tout cela, allons dans notre controlleur Index, se trouvant dans le namespace Pfay\Contacts\Controller\Test.
Modifier ce fichier de la façon suivante :

<?php

namespace Pfay\Contacts\Controller\Test;

class Index extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        $contact = $this->_objectManager->create('Pfay\Contacts\Model\Contact');
        $contact->setName('Paul Dupond');
        $contact->save();
        die('test');
    }
}

La classe étend \Magento\Framework\App\Action\Action qui contient par défaut l'objet _objectManager qui va vous permettre d'instancier votre Model.
Vous instanciez donc votre Model Contact, vous définissez un nom avec setName et vous sauvegardez avec la méthode save().
Si j'avais une propriétée toto, je ferait setToto('ma_valeur'). Bref vous avez compris le principe ;)

Visitez ensuite l'url www.magento2.lan/index.php/contacts/test. Vous devez voir apparaitre une page blanche avec "test" écrit dessus.

Créer des objets

Je change le code pour ajouter plusieurs contacts :

<?php

namespace Pfay\Contacts\Controller\Test;

use Magento\Framework\App\Action\Action;

class Index extends Action
{
    public function execute()
    {
        $contact = $this->_objectManager->create('Pfay\Contacts\Model\Contact');
        $contact->setName('Paul Dupond');
        $contact->save();

        $contact = $this->_objectManager->create('Pfay\Contacts\Model\Contact');
        $contact->setName('Paul Ricard');
        $contact->save();

        $contact = $this->_objectManager->create('Pfay\Contacts\Model\Contact');
        $contact->setName('Jack Daniels');
        $contact->save();
        die('test');
    }
}

Visitez la page et hop vos 3 Contacts ont été ajoutés ! Allez ensuite dans votre base de donnée et vous verrez que votre contact Dupond, Ricard ou encore ce bon vieux Jack a bien été ajouté ;)

mysql> select * from pfay_contacts;
+------------------+--------------+--------+---------+
| pfay_contacts_id | name         | email  | comment |
+------------------+--------------+--------+---------+
|                1 | Paul Dupond  | simple | 0       |
|                2 | Paul Ricard  | simple | 0       |
|                3 | Jack Daniels | simple | 0       |
+------------------+--------------+--------+---------+
3 rows in set (0.00 sec)

Jouer avec les collections magento2

Je change encore le code de mon controlleur pour faire le test :

namespace Pfay\Contacts\Controller\Test;

class Index extends \Magento\Framework\App\Action\Action
{
    public function execute()
    {
        $contactModel = $this->_objectManager->create('Pfay\Contacts\Model\Contact');
        $collection = $contactModel->getCollection()->addFieldToFilter('name', array('like'=> 'Paul Ricard'));
        foreach($collection as $contact) {
            var_dump($contact->getData());
        }        
        die('test');
    }
}
Cette fois, je récupère la collection d'objet de type Contact à partir de la méthode getCollection(), je filtre sur le nom avec la méthode addFieldToFilter() pour le récupérer que les objets de type Contact avec un nom "Paul Ricard" et je parcours ma collection pour afficher les résultats.

Et voilà ! c’est déjà la fin de ce tutoriel. Cela ne fonctionne pas chez vous ? Récupérer les sources de ce module en bas de cet article et trouvez plus facilement votre erreur.

Vous savez maintenant ajouter un Model, un ResourceModel et une Collection dans votre projet magento2 pour pouvoir intérragir avec la base de donnée. Nous rentrerons plus en détails dans le fonctionnement de la base de donnée et comment interagir avec dans une prochaine leçon.

Si vous avez aimé ce tutoriel, s’il vous plait remerciez moi en 1 clic en partageant cet article sur twitter, googleplus ou facebook, ça peut paraitre inutile mais pour moi c’est très important. Merci à ceux qui le feront ;) N’hésitez pas également à poser vos questions dans les commentaires (pour ceux qui partagent l’article), j’essaierai de répondre rapidement.
Bon courage à tous pour la suite de ces tutoriels sur magento2 !
Documents disponibles pour cet article :
Questions sur cette leçon
Pas de questions pour cette leçon. Soyez le premier !

Vous devez etre connecté pour demander de l'aide sur une leçon.