Nette Database – UPDATE mi do query hodí závorky

unbringer
Člen | 9
+
0
-

Zdravím,
Mám problém s vybudováním UPDATE, který by prošel. SqlBuilder, který staví query, mi tam hodí závorky na místo, kde by neměly být.

return $this->database->table('Attendance')->where('StudentClassId = ? AND LessonId = ?',
                $values[0]['StudentClassId'],
                $values[0]['LessonId'])
            ->update($values);

Query:

UPDATE `Attendance`
SET (`StudentUserId`='25', `StudentClassId`='39', `LessonId`='18', `AttendanceDate`='2020-09-03', `AttendanceTypeId`='1',
`AttendanceCard`='99')
WHERE (`StudentClassId` = '39' AND `LessonId` = '18')

Nevíte někdo, jak ten dotaz přepsat?
Byl jsem většinou zvyklý si ty query psát ručně, ale když pracuju s array, tak mi tohle dost usnadnilo práci a vypisování query.

Editoval unbringer (26. 9. 2020 21:57)

Šaman
Člen | 2635
+
0
-

Předpokládám, že v tom poli máš uložené stringy místo intů.
Dumpni si např.

bdump($values[0]['StudentClassId']);
unbringer
Člen | 9
+
0
-

Díky. Zkusím předělat.

Jsem to právě v 1 ráno dumpoval, vše vypadalo ok, když jsem tu query hodil do adminu bez závorek, tak to prošlo :D

unbringer
Člen | 9
+
0
-

Nepomohlo to.

Zkusil i vynutit konverzi na správné datové typy. Dosadit tam i natvrdo odpovídající hodnoty. Pořád si to tam vesele hází závorky.

public function updateAttendances($values)
{
    foreach ($values as $key => $value)
    {
        $values[$key]['StudentUserId'] = (int)$value['StudentUserId'];
        $values[$key]['StudentClassId'] = (int)$value['StudentClassId'];
        $values[$key]['AttendanceTypeId'] = (int)$value['AttendanceTypeId'];
        $values[$key]['LessonId'] = (int)$value['LessonId'];
        $values[$key]['AttendanceCard'] = (int)$value['AttendanceCard'];
        $values[$key]['AttendanceDate'] = date('d.m.Y', $value['AttendanceDate']);
    }

    bdump($values);

    return $this->database->table('attendance')->where('StudentClassId = ? AND LessonId = ?',
            $values[0]['StudentClassId'],
            $values[0]['LessonId'])
        ->update($values);
}
UPDATE `attendance`
SET (`StudentUserId`=25, `StudentClassId`=39, `LessonId`=18, `AttendanceDate`='01.01.1970', `AttendanceTypeId`=1,
`AttendanceCard`=55)
WHERE (`StudentClassId` = 39 AND `LessonId` = 18)

Editoval unbringer (26. 9. 2020 18:55)

MajklNajt
Člen | 471
+
+1
-

a keď spravíš toto?

$this->database->table('attendance')->where(...)->update($values[0]);

(čistý tip)

Šaman
Člen | 2635
+
+1
-

Eh. závorky? Já myslel, že ti vadí uvozovky okolo numerických idček. Nojo, na tom zformátovaným je to vidět. Ale nenapadá mě, proč to dělá. Resp. napadá mě, že máš ta pole ještě vnořená. Tedy že $values nebsahují prvky, ale ty jsou až ve $values[0] a pak by mělo pomoct to co psal MajklNajt. I tohle by ale měl odhalit dump dat, která předáváš.

Editoval Šaman (26. 9. 2020 19:50)

unbringer
Člen | 9
+
+1
-

Nene, šlo fakt o uvozovky.
Akorát jsem si u prvního příspěvku nevšiml, že ten kód musím dát do tagu PHP kódu.

Díky moc, už to funguje. Byl tam problém, že jsem měl pole záznamů, co jsem chtěl vkládat do DB.
Tak jsem tam nad tím polem hodil foreach.

public function updateAttendances($values)
{
        foreach ($values as $key => $value)
        {
            $this->database->table('attendance')->where('StudentUserId = ? AND StudentClassId = ? AND LessonId = ?',
                $values[$key]['StudentUserId'],
                $values[$key]['StudentClassId'],
                $values[$key]['LessonId'])
                ->update($values[$key]);
        }
}