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

Publié le 18/01/2020 • Actualisé 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 🇬🇧 Close

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);

namespace App\Controller\Snippet;

use Doctrine\DBAL\Connection;

/**
 * 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.
 *
 * @property Connection $connection
 */
trait Snippet71Trait
{
    public function snippet71(): void
    {
        $sql = "SELECT name FROM article WHERE name REGEXP '^D.*[1-9]'";
        echo $sql.PHP_EOL.PHP_EOL;

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

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

  Travaillez avec moi !

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use App\Tests\WebTestCase;
use Doctrine\DBAL\Connection;

/**
 * @see Snippet71Trait
 */
final class Snippet71Test extends WebTestCase
{
    private Connection $connection;

    protected function setUp(): void
    {
        $this->connection = $this->getDoctrineDefaultConnection();
    }

    /**
     * @see Snippet71Trait::snippet71
     */
    public function testSnippet71(): void
    {
        $results = $this->connection->fetchAssociative("SELECT name FROM article WHERE name REGEXP '^D.*[1-9]'");
        $phpRegexp = '/D.*[1-9]/';
        if (!\is_array($results)) {
            throw new \RuntimeException('Invalid data returned.');
        }
        foreach (array_column($results, 'name') as $name) {
            self::assertMatchesRegularExpression($phpRegexp, $name);
        }

        // article that doesn't match
        /** @var array{name: string} $results */
        $results = $this->connection->fetchAssociative('SELECT name FROM article WHERE id = 1');
        self::assertDoesNotMatchRegularExpression($phpRegexp, $results['name']);
    }
}