Utilisation d'une expression régulière dans une requête MySQL
Publié le 18/01/2020 • Actualisé le 18/01/2020
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
<?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']);
}
}