3 - Création de la base de données (Symfony 6)

Catégories : Symfony

Série : Symfony 6

Fichiers : https://github.com/NouvelleTechno/e-commerce-Symfony-6

Mots-clés : Symfony donnees base symfony6 doctrine

1014 lectures

Auteur : user Benoit

Date :

Après avoir configuré notre projet, il est temps de créer notre base de données.

Créer la base

Dans un premier temps, nous allons créer la base vide au moyen du terminal en utilisant Doctrine par la commande suivante

symfony console doctrine:database:create

Créer les entités

Après avoir créé la base de données, nous allons créer les entités dans notre projet, chaque entité correspondra à une table dans la base de données.

Je fais le choix de nommer mes entités au pluriel, c'est un choix personnel.

Il n'existe aucune règle, ce qui compte est la cohérence sur tout le projet.

Pour créer une entité, nous utiliserons la commande suivante dans le terminal

symfony console make:entity

Ensuite, en suivant l'assistant, nous définirons plusieurs critères :

  • Le nom de l'entité, par exemple Produits qui sera intégré dans la base de données sous le nom produits
  • La liste des propriétés souhaitées et leur type. Voici la liste des types autorisés
    • Types principaux
      • string
      • text
      • boolean
      • integer (or smallint, bigint)
      • float
    • Relations
      • relation (assistant)
      • ManyToOne
      • OneToMany
      • ManyToMany
      • OneToOne
    • Tableaux / Objets
      • array (ou simple_array)
      • json
      • object
      • binary
      • blob
    • Date / Heure
      • datetime (ou datetime_immutable)
      • datetimetz (or datetimetz_immutable)
      • date (or date_immutable)
      • time (or time_immutable)
      • dateinterval
    • Autres
      • ascii_string
      • decimal
      • guid
  • Les propriétés spécifiques au type choisi

Après avoir suivi l'assistant, nous obtenons un fichier php dans src/Entity qui porte le nom de l'entité, par exemple Produits.php

Dans ce fichier, vous retrouverez les propriétés, le type de données et les accesseurs comme ci-dessous

<?php

namespace App\Entity;

use App\Repository\ProductsRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ProductsRepository::class)]
class Products
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string', length: 255)]
    private $name;

    #[ORM\Column(type: 'text')]
    private $description;

    #[ORM\Column(type: 'integer')]
    private $price;

    #[ORM\Column(type: 'integer')]
    private $stock;

    #[ORM\Column(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
    private $created_at;

    #[ORM\ManyToOne(targetEntity: Categories::class, inversedBy: 'products')]
    #[ORM\JoinColumn(nullable: false)]
    private $categories;

    #[ORM\OneToMany(mappedBy: 'products', targetEntity: Images::class, orphanRemoval: true)]
    private $images;

    #[ORM\OneToMany(mappedBy: 'products', targetEntity: OrdersDetails::class)]
    private $ordersDetails;

    public function __construct()
    {
        $this->images = new ArrayCollection();
        $this->ordersDetails = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getPrice(): ?int
    {
        return $this->price;
    }

    public function setPrice(int $price): self
    {
        $this->price = $price;

        return $this;
    }

    public function getStock(): ?int
    {
        return $this->stock;
    }

    public function setStock(int $stock): self
    {
        $this->stock = $stock;

        return $this;
    }

    public function getCreatedAt(): ?\DateTimeImmutable
    {
        return $this->created_at;
    }

    public function setCreatedAt(\DateTimeImmutable $created_at): self
    {
        $this->created_at = $created_at;

        return $this;
    }

    public function getCategories(): ?Categories
    {
        return $this->categories;
    }

    public function setCategories(?Categories $categories): self
    {
        $this->categories = $categories;

        return $this;
    }

    /**
     * @return Collection|Images[]
     */
    public function getImages(): Collection
    {
        return $this->images;
    }

    public function addImage(Images $image): self
    {
        if (!$this->images->contains($image)) {
            $this->images[] = $image;
            $image->setProducts($this);
        }

        return $this;
    }

    public function removeImage(Images $image): self
    {
        if ($this->images->removeElement($image)) {
            // set the owning side to null (unless already changed)
            if ($image->getProducts() === $this) {
                $image->setProducts(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|OrdersDetails[]
     */
    public function getOrdersDetails(): Collection
    {
        return $this->ordersDetails;
    }

    public function addOrdersDetail(OrdersDetails $ordersDetail): self
    {
        if (!$this->ordersDetails->contains($ordersDetail)) {
            $this->ordersDetails[] = $ordersDetail;
            $ordersDetail->setProducts($this);
        }

        return $this;
    }

    public function removeOrdersDetail(OrdersDetails $ordersDetail): self
    {
        if ($this->ordersDetails->removeElement($ordersDetail)) {
            // set the owning side to null (unless already changed)
            if ($ordersDetail->getProducts() === $this) {
                $ordersDetail->setProducts(null);
            }
        }

        return $this;
    }
}

Vous retrouverez tous les exemples dans la vidéo et sur le Git du projet.

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Guilded pour une entraide par chat.