Utilisation d'une expression régulière dans une requête MySQL

Publié le 18/01/2020 • Mis à jour le 18/01/2020


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

Dans ce bout de code nous allons voir comment utiliser une expression régulière dans une requête MySQL. Tout d'abord, dans la clause where nous déclarons la colonne sur laquelle va se faire la selection, puis, nous mettons le mot-clé REGEXP suivi du motif à utiliser. Dans cet exemple, nous récupérons tous les articles ayant un titre commençant par un "D" suivi d'au moins un nombre. Exécutez le snippet pour vérifier que les articles retournés par la requête correspondent bien.


<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet71Trait.php

namespace App\Controller\Snippet;

use Doctrine\DBAL\Connection;
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet71Trait
{
    public function snippet71(): void
    {
        if (!$this->connection instanceof Connection) {
            throw new InvalidTypeException('Doctrine connection is invalid.');
        }

        $sql = "SELECT name FROM article WHERE name REGEXP '^D.*[1-9]'";
        echo $sql.PHP_EOL.PHP_EOL;

        var_dump(array_column($this->connection->fetchAll($sql), 'name'));

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ showUnitTestButtonLabel ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

<?php declare(strict_types=1);

namespace App\Tests\Controller\Snippets;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @covers Snippet71Trait
 */
final class Snippet71Test extends KernelTestCase
{
    private $connection;

    protected function setUp(): void
    {
        self::bootKernel();
        $this->connection = self::$kernel->getContainer()->get('doctrine.dbal.default_connection');
    }

    /**
     * @covers Snippet71Trait::snippet71
     */
    public function testSnippet71(): void
    {
        $results = $this->connection->fetchAll("SELECT name FROM article WHERE name REGEXP '^D.*[1-9]'");
        $phpRegexp = '/D.*[1-9]/';
        foreach (array_column($results, 'name') as $name) {
            $this->assertRegExp($phpRegexp, $name);
        }

        // article that doesn't match
        $results = $this->connection->fetchAssoc('SELECT name FROM article WHERE id = 1');
        $this->assertNotRegExp($phpRegexp, $results['name']);
    }
}