jak získat nejvyšší primary id z db pomocí nette? resp primary id který bude následovat
- mkoubik
- Člen | 728
Pokud jsi ho tam právě vložil, tak
$database->lastInsertId('foo_bar_id_seq')
.
Obecně SELECT id FROM foo_bar ORDER BY id DESC LIMIT 1
, ale abys
měl jistotu, že bude následující id ještě volné, tak to musíš udělat
v transakci.
$database->beginTransaction();
try {
$id = $database->query('SELECT id FROM foo_bar ORDER BY id DESC LIMIT 1')->fetch()['id'];
// .. insert $id + 1
$database->commit();
} catch (\PDOException $e) {
$database->rollback();
}
- qteck
- Člen | 164
Ou, transakce, tak s těmi jsem ještě nepracoval, já to udělal v podstatě jako v tvojí první variantě:
<?php
function getIdOfLastPic()
{
return $this->conn->table('gallery_pictures')->select('id')->order('id DESC')->limit(1)->fetch();
}
tak jsem si o tom něco přečetl a dává to smysl, ale zajímá ě, jestli tenhle tvůj script pošlape s tou základní nette database?
Jo a ještě jeden dotaz, když to potom volám jako funkci v presenteru, nepozbývá to smyslu?
if(move_uploaded_file($img->temporaryFile, $path_original.$img->name))
{
$type = explode('.', $img->name);
$newName = ($this->upload->getIdOfLastPic()+1) . '.' . \Nette\Utils\Strings::lower(end($type));
rename($path_original . $img->name , $path_original . $newName); // na id vložného záznamu
$this->upload->insertPic($newName, $valuesOfForm->id_author, $valuesOfForm->gallery);
}
Editoval qteck (2. 6. 2014 10:40)
- mkoubik
- Člen | 728
Na tu práci se soubory si udělej službu, a buď ji injektni do téhle,
nebo použij události.
Ten upload bys měl zpracovávat také „transakčně“, předpokládám, že
když se ten řádek nepodaří vložit do db, tak chceš ten soubor zase
smazat.
BTW: používej API třídy FileUpload
.
Něco jako:
$database->beginTransaction();
try {
$id = ...
$filename = ...
$upload->move($path . '/' . $filename);
$database->insert(...);
$database->commit();
} catch(\PDOEception $e) {
$database->rollback();
unlink(...);
}
Editoval mkoubik (2. 6. 2014 11:20)
- qteck
- Člen | 164
udělm to tak jak jsi napsal, ale teď pro zjednodušení, b tom tém příkladu mě čeká to stejné,
mom kod:
($this->upload->getIdOfLastPic()->id+1)
a nette mi hlasí Notice
Trying to get property of non-object
<?php
function getIdOfLastPic()
{
return $this->conn->table('gallery_pictures')->select('id')->order('id DESC')->limit(1)->fetch();
}
- Oli
- Člen | 1215
Co ti vrací ta funkce getIdOfLastPic? Nevrací ti náhodou false? Máš už nějakej záznam v databázi?
Fetch() vrací false, pokud není vybraný řádek, pokud máš prázdnou tabulku, tak ti ten fetch vrátí false, takže si tam doplň např. něco jako:
$lastId = $this->conn->table('gallery_pictures')->select('id')->order('id DESC')->limit(1)->fetch();
return $lastId ? $lastId->id : 0;