X

Nouvelle syntaxe JSON-column where() et update() dans Laravel 5.3


Bien que Laravel ait la possibilité de convertir vos données vers et depuis JSON depuis la version 5.0, ce n’était auparavant qu’une commodité – vos données étaient encore stockées dans un champ TEXT. Mais MySQL 5.7 a introduit un type de colonne JSON réel.

Laravel 5.3 introduit une syntaxe simple pour les recherches et les mises à jour basées sur la valeur de clés spécifiques dans vos colonnes JSON.

Supposons que nous ayons une table avec une colonne JSON :

...
class CreateContactsTable extends Migration
{
    public function up()
    {
        Schema::create('contacts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->json('meta');
            $table->timestamps();
        });
    }

Nous imaginons que chaque contact dispose d’informations fondamentales telles que son nom, mais certaines autres propriétés sont flexibles. La meilleure façon de les stocker pourrait être une colonne JSON, comme notre meta colonne ci-dessus.

Nous pourrions imaginer qu’un contact (sortie vers JSON pour la lisibilité des articles de blog) pourrait ressembler à ceci :

{
    "id": 1,
    "name": "Alphonse",
    "meta": {
        "wants_newsletter": true,
        "favorite_color": "red"
    }
}

Alors, obtenons tous nos contacts dont la couleur préférée est le rouge. Comme vous pouvez le voir ci-dessous, nous commençons par la colonne (meta), suivi d’une flèche (->), suivi du nom de la clé de la propriété JSON (favorite_color).

$redLovers = DB::table('contacts')
    ->where('meta->favorite_color', 'red')
    ->get();

Cela signifie “rechercher chaque entrée dans le contacts table contenant un objet JSON stocké dans meta qui a une clé de favorite_color c’est réglé sur red.”

Et si nous voulions mettre à jour Alphonse pour qu’il ne veuille plus la newsletter ?

DB::table('contacts')
    ->where('id', 1)
    ->update(['meta->wants_newsletter' => false]);

Ce qui est génial ici, c’est que même si le wants_newsletter clé n’était pas précédemment définie sur cet enregistrement, elle le sera maintenant et sera correctement définie sur false.

Vous voyez la puissance ? Nous pouvons interroger en fonction des propriétés de la colonne JSON et nous pouvons mettre à jour des éléments individuels de la colonne JSON sans avoir à connaître ou à nous soucier des autres. Brillant.

Remarque : MariaDB n’a pas de colonnes JSON et PostgreSQL a des colonnes JSON, mais cette fonctionnalité semble ne pas fonctionner actuellement sur elles. Considérez donc cela comme une fonctionnalité de MySQL 5.7+ pour le moment.