tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

dibi fluent + oracle limit v podmienke IN %l

před 5 lety

fliper333
Člen | 33
+
0
-

Ahojte,

Dnes som narazil na obmedzenie ORACLE, kde vo vetve „WHERE [row] IN %l“ ma limit 1000 zaznamov. Robim ale s velkou databazou, kde potrebujem porovnat viac ako 1000 udajov.

Nasiel som ako sa to da obist. Pole sa rozdeli na mensie polia s dlzkou 1000 (v PHP array_chunk) a potom sa prikaz prepise nasledovne:

WHERE [row] IN %l, pole[0] OR
WHERE [row] IN %l, pole[1] OR

Neviem ale ako cez dibi fluent tento prikaz zlozit, ak v nom mam viac podmienok. Fluent mi prida OR na koniec prikazu a tym padom to nefunguje ako ma. Tieto OR prikazy musia byt v zatvorke a celok musi byt pripojeny k prikazu cez AND.

$query =
   dibi::select('ID')
       ->from('USERS')
           ->where('ACTIVE = %s', 'Y')
           ->where('REPORT IS NOT NULL');

$managers = array_chunk($managers, 1000);

foreach ($managers as $m)
    $query->or('MANAGER_ID IN %l', $m);

return $query->fetchPairs();

Vysledok aky by som potreboval:

SELECT
   [ID]
FROM
   [USERS]
WHERE
   [ACTIVE] = 'Y'
AND
   REPORT IS NOT NULL
AND
   (
       [MANAGER_ID] IN (...) OR
       [MANAGER_ID] IN (...) OR
       [MANAGER_ID] IN (...)
   )

Vysledok aky mi to generuje:

SELECT
   [ID]
FROM
   [USERS]
WHERE
   [ACTIVE] = 'Y'
AND
   REPORT IS NOT NULL
OR
   [MANAGER_ID] IN (...)
OR
   [MANAGER_ID] IN (...)
OR
   [MANAGER_ID] IN (...)

Vopred dakujem za rady.

před 5 lety

Milo
Moderator | 1031
+
0
-
$db
->select('ID')->from('USERS')
->where('ACTIVE = %s', 'Y')
->where('REPORT IS NOT NULL')
->where('(%or)', array(
    array('MANAGER_ID IN %in', array(1, 2, 3)),
    array('MANAGER_ID IN %in', array(4, 5, 6)),
    array('MANAGER_ID IN %in', array(7, 8, 9)),
))

před 5 lety

fliper333
Člen | 33
+
0
-

Tak toto ma vazne nenapadlo :) Diky moc Milo.