sql >> Databasteknik >  >> RDS >> Mysql

Sök i JSON-kolumnen med Laravels vältaliga

För att se om template_ids JSON-fältet innehåller "något" av värdena i en nåluppsättning, du måste använda flera ELLER 'd JSON_CONTAINS villkor som kräver 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);

Laravels frågebyggare kommer att producera en fråga som:

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

Som inriktar sig på poster som har något av dessa ID:n i sina template_ids JSON-typat fält.

Du kanske är intresserad av att läsa ett relaterat Laravel internals förslag .



  1. Exempel på parametriserade frågor

  2. Välj / Infoga version av en Upsert:finns det ett designmönster för hög samtidighet?

  3. Cachedata i PHP SESSION, eller fråga från db varje gång?

  4. MYSQL inaktivera Auto-trim