jak získat nejvyšší primary id z db pomocí nette? resp primary id který bude následovat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
qteck
Člen | 164
+
0
-

Ahoj,

viz nadpis,

Díky za odpověď,
ještě trochu drunk Petr.

mkoubik
Člen | 728
+
0
-

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
+
0
-

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)

qteck
Člen | 164
+
0
-

jo ty si to tu vlastně v tom komentáři // naznačil. že by to mělo být uvnitř.

Tak to mi pak napadá jenom otázka, kde by tahle část scriptu měla být? v presenteru db dotaz určitě né, ale ten upload? Díky.

mkoubik
Člen | 728
+
0
-

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
+
0
-

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
+
0
-

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;
qteck
Člen | 164
+
0
-

přesně tak :d, díky :-))

jsem si to neuvědomil. mam kocovinu jak hovadu. jsem úplně zapomně že jsem tu tabulku před chvilkou vyčistil