tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Primary key na viacerych stlpcoch a DibiFluent

před 9 lety

westrem
Člen | 398

Ahoj,
s dibi som uz celkom otukany, no dnes som bol postaveny (som sa sam postavil) pred ukol, pri ktorom som sa s dibi sam zapotil.

Majme situaciu, ze v nasej tabulke je PRIMARY KEY index na 2 stlpcoch a to id a e_id. Chceme pomocou DibiFluent vykonat dotaz s klauzulou where kde budeme referencovat takyto PK pomocou operatoru IN.

Otazka znie, ako to zapisat? Na 3× sa mi to podarilo, no vysledok nie je priamociary a dosiel som k nemu len vdaka tomu, ze miestami dost dobre poznam creva dibi:

dibi::select('*')
    ->from('[table]')
    ->where('(%n) IN %l',
        array('id', 'e_id'),
        array(
          '1%l' => array(0,0),
          '2%l' => array(1,3),
          '3%l' => array(9,9),
        )
);

a vysledok:

SELECT
    *
FROM
    `table`
WHERE
    (`id`, `e_id`) IN ((0, 0), (1, 3), (9, 9))

Otazka znie, ide toto zapisat aj inak? (rozumej krajsie, intuitivnejsie).

Ak ano ako?

Ak nie, otazka na Davida, nebolo by vhodne popremyslat nad sposobom aby dibi vedelo handlovat vnorene listy, tzn. ak mam operator %l a posuniem mu pole polí, aby vnutorne hodnoty tiez automaticky vyhodnocoval s operatorom %l? (Zavadza sa tym urcita magia a neviem ci by to nevnieslo aj nejaku bezp. dieru, no podla mna by sa takato situacia mohla – mala vyriesit).

před 9 lety

Milo
Nette Core | 1119

Já to řešil takhle a to je asi ještě horší.

$ids = array(
    array( '%and', array( 'id%i' => 1, 'eid%i' => 1 )),
    array( '%and', array( 'id%i' => 2, 'eid%i' => 2 )),
    array( '%and', array( 'id%i' => 3, 'eid%i' => 3 )),
);
dibi::query( "SELECT * FROM [table] WHERE %or", $ids );