tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

DiBi Fluent Update na JOIN

před 3 lety

mdjimy
Člen | 9
+
0
-

Nazdar, právě jsem narazil na problém s update.
Při fluent syntaxi se mi nedaří provést update na zjoinované tabulky, viz. přiložený kód.

\dibi::command()->
    update(Owner::TABLE)->
    leftJoin(OwnersQuota::TABLE)->
    on('%n = %n', Owner::ID(), OwnersQuota::ID_OWNER())->
    set('%n = 0', OwnersQuota::QUOTA())->
    where('%n = %s', Owner::SKODA_NO(), $ident)->
    test();

Vrací:

UPDATE `owner`
SET `owners_quota`.`quota` = 0
WHERE `owner`.`skoda_no` = '555'
FROM
LEFT JOIN `owners_quota` ON `owner`.`id` = `owners_quota`.`id_owner`

A já potřebuji:

UPDATE `owner`
LEFT JOIN `owners_quota` ON `owner`.`id` = `owners_quota`.`id_owner`
SET `owners_quota`.`quota` = 0
WHERE `owner`.`skoda_no` = '2004A'

Řešil už to někdo?

před 3 lety

Milo
Moderator | 1031
+
0
-

Můžeš si upravit pořadí klauzulí.

DibiFluent::$masks['UPDATE'] = array(
    'UPDATE', 'LEFT JOIN', 'SET', 'WHERE', 'ORDER BY', 'LIMIT'
);

Ale pokud updatuješ pouze jednu tabulku z toho joinu, nebyl by lepší obyčejný update se subselectem v podmínce?

před 3 lety

mdjimy
Člen | 9
+
0
-

Milo napsal(a):

Můžeš si upravit pořadí klauzulí.

DibiFluent::$masks['UPDATE'] = array(
  'UPDATE', 'LEFT JOIN', 'SET', 'WHERE', 'ORDER BY', 'LIMIT'
);

Ale pokud updatuješ pouze jednu tabulku z toho joinu, nebyl by lepší obyčejný update se subselectem v podmínce?

Díky za odpověď, ale moc se mi nelíbí, že si to tímto přepíšu v rámci celé aplikace, i když vlastně pokud si hodnotu DibiFluent::$masks[‚UPDATE‘] uložím do tempu a pak ji obnovím, tak by to šlo…

Jinak řešení pomoci sub-selectu mne nenapadlo, dobrá připomínka, ale v mém případě by to stejně nebylo možné… Obě tabulky mají milióny záznamů, což by MySQL velmi těžce rozdýchávalo… :)