Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rechercher dans la colonne JSON en utilisant l'éloquent de Laravel

Pour voir si les template_ids Le champ JSON contient "n'importe laquelle" des valeurs d'un tableau d'aiguilles, vous devrez utiliser plusieurs OR 'd JSON_CONTAINS conditions nécessitant MySQL 5.7 :

$ids = ['1', '3', '48'];

Post::where('accessable_to', 1)
    ->where(function ($query) use ($ids) {
        $firstId = array_shift($ids);

        $query->whereRaw(
            'JSON_CONTAINS(template_ids, \'["' . $firstId . '"]\')'
        );

        foreach ($ids as $id) {
            $query->orWhereRaw(
                'JSON_CONTAINS(template_ids, \'["' . $id . '"]\')'
            );
        }

        return $query;
    });

return Post::paginate(3);

Le générateur de requêtes de Laravel produira une requête du type :

SELECT * FROM "posts" 
WHERE "accessable_to" = ? AND (
    JSON_CONTAINS(template_ids, '["1"]') OR 
    JSON_CONTAINS(template_ids, '["3"]') OR 
    JSON_CONTAINS(template_ids, '["48"]')
)

Qui cible les enregistrements qui ont l'un de ces identifiants dans leur template_ids Champ de type JSON.

Vous pourriez être intéressé par la lecture d'une proposition interne de Laravel .