Update řádku v modelové vrstvě

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

Zdravím,

snažím se psát aplikaci tak, aby veškerá práce s databází byla v modelu a presenter pouze používal jeho funkce. Problém mám s funkcí, která má aktualizovat řádek v databázi.

Model (HomepageFacade):

public function updateBox($id, $properties)
{
    $this->db->table('homepageboxes')->where('id', $id)->update( (array) $properties);
}

Presenter (HomepagePresenter):

public function editBoxFormSubmitted(Form $form)
{
    if (!IsSet($form->values)) {
        $this->flashMessage('Nebyly vyplněny všechny povinné položky formuláře', 'flashError');
        $this->redirect('this');
    } else {
        // použití updateBox
        $this->homepageFacade->updateBox($this->id, array(
            'title' => $form->values->title,
            'content' => $form->values->content,
            'modified' => date('Y-m-d H:i:s'),
        ));

        $this->flashMessage('Box byl úspěšně upraven', 'flashSuccess');
        $this->redirect('Homepage:default');
    }
}

Děkuji za všechny odpovědi, opravdu nevím, co ten updateBox dělá.

ViPEr*CZ*
Člen | 822
+
0
-

Tohle bych přepsal na toto:

public function updateBox($id, array $properties)
{
    $this->db->table('homepageboxes')->where('id', $id)->update($properties);
}

A co na tom nechápete? V tabulce homepageboxes se aktualizují sloupce podle $properties na řádku id = $id

Grelek
Člen | 233
+
0
-

Já vím, že to aktualizuje řádek s ID = $id.

Ale i když je funkce podle vás, nefunguje to. Respektive, jakoby proběhne, přesměruje se a vypíše se flash message, avšak s řádkem v databázi se nestane zhola nic. Je pořád stejný.

ViPEr*CZ*
Člen | 822
+
0
-

Tak todle $this->db->table(‚homepageboxes‘)->where(‚id‘, $id)->update($properties); se dá dát ještě do bloku try…catch a zachytávat PDOException… a taky máte Debug nástroj od Nette (mimochodem jedna z nejlepších věcí na Nette)… jednoduše vyhoďte redirect a podívejte na výpis SQL, zda-li se Vám generuje vůbec UPDATE dotaz.

Grelek
Člen | 233
+
0
-

No, používám oba doplňky do Firefoxu, ale tam není žádný výstup, dokonce i zachytávám vyjímky.

Ale nejsem až tak zběhlý s debugováním v Nette, jako Nette guru, takže bych vás poprosil o radu, jak vyhodit redirect, stopnout ho v něm.

ViPEr*CZ*
Člen | 822
+
0
-

Pošlete jak to máte s try…catch. Tady v té metodě co jste poslal to nemáte. Myslel jsem zakomentovat toto: $this->redirect(‚Homepage:default‘); a podívat se dole vpravo na stránce do Debugbaru, kde se vypisují SQL dotazy. Takhle nějak ten bar vypadá: http://i50.tinypic.com/2m812bm.png

Grelek
Člen | 233
+
0
-

Debugbar vyzkouším, zítra podám hlášení.

public function updateBox($id, array $properties)
{
    try {
        $this->db->table('homepageboxes')->where('id', $id)->update($properties);
    } catch (PDOException $e) {
        Debugger::fireLog($e);
    }
}
RadH
Člen | 23
+
0
-

Zkus použít toto

$this->db->table('homepageboxes')->where('id', $id)->fetch()->update($properties);

Pokud je ‚id‘ primární klíč tak lze takto

$this->db->table('homepageboxes')->get($id)->update($properties);
Grelek
Člen | 233
+
0
-

RadH napsal(a):

Zkus použít toto

$this->db->table('homepageboxes')->where('id', $id)->fetch()->update($properties);

Pokud je ‚id‘ primární klíč tak lze takto

$this->db->table('homepageboxes')->get($id)->update($properties);

V obou případech se objeví hláška: Call to a member function update() on a non-object.

Jinak jsem zkoušel stopnout redirect, jak psal ViPEr*CZ*. Dotazy se složí správně, dumpnul jsem i proměnné formuláře, předají se správně, tak jsem z toho zmatený.

vvoody
Člen | 910
+
0
-

Selection funkcia get
Returns
Nette\Database\Table\ActiveRow
or FALSE if there is no such row

$row = $this->db->table('homepageboxes')->get($id);
if($row != FALSE){
	$row->update($properties);
}else{
	// flashmsg alebo nieco
}

pri fetch to iste, nemozes cakat ze databaza ti vrati vzdy nejaky vysledok

ViPEr*CZ*
Člen | 822
+
0
-

Ono to takhle vypadá, že pokud mu to hodilo tu chybu, že se pokouší upravit nějaký řádek, ale ten dotaz žádný řádek s tím idéčkem neexistuje (nenajde se).

Grelek
Člen | 233
+
0
-

Ha!

Když mám dotaz v mém původním tvaru, to je:

public function updateBox($id, array $properties)
{
    try {
        $this->db->table('homepageboxes')->where('id', $id)->update($properties);
    } catch (PDOException $e) {
        Debugger::fireLog($e);
    }
}

Tak se mi špatně složí SQL dotaz. Vypadá takhle:

UPDATE homepageboxes SET title='Co víme nejlépe?', content=?, modified='2012-07-12 14:49:06' WHERE (id IS NULL)

Ale když dám dump na formulářové hodnoty, jsou správně, takže hodnoty dotazu jsou správně, problém je s WHERE (id IS NULL).

Jan Endel
Člen | 1016
+
0
-

ukaž volání metody updateBox

Grelek
Člen | 233
+
0
-
class HomepagePresenter extends SecuredPresenter
{
    private $homepageFacade;
    private $id;

    function __construct(\HomepageFacade $homepageFacade)
    {
        $this->homepageFacade = $homepageFacade;
    }

    // zkráceno...
    public function actionEditBox($id)
    {
        $this->flashMessage('Na této funkci se stále pracuje', 'flashInfo');
        $this['editBoxForm']->setDefaults(array(
            'title' => $this->homepageFacade->getBox($id)->title,
            'content' => $this->homepageFacade->getBox($id)->content,
            'modified' => $this->homepageFacade->getBox($id)->modified,
        ));
    }
    // zkráceno...
    $this->homepageFacade->updateBox($this->id, array(
        'title' => $form->values->title,
        'content' => $form->values->content,
        'modified' => date('Y-m-d H:i:s'),
    ));

Editoval Grelek (12. 7. 2012 15:55)

Ascaria
Člen | 187
+
0
-

Jsi si jistý že $this->id není null? Zkus si to dumpnout.

    \Nette\Diagnostics\Debugger::barDump(Array($this->id), 'ajdy');
    $this->homepageFacade->updateBox($this->id, array(
// ...

Edit: Dle kontextu usuzuju, že tam nemá být $this->id ale $id.

Editoval Ascaria (12. 7. 2012 16:12)

Grelek
Člen | 233
+
0
-

Ascaria napsal(a):

Jsi si jistý že $this->id není null? Zkus si to dumpnout.

    \Nette\Diagnostics\Debugger::barDump(Array($this->id), 'ajdy');
    $this->homepageFacade->updateBox($this->id, array(
// ...

Edit: Dle kontextu usuzuju, že tam nemá být $this->id ale $id.

Panebože, stydím se..

Nene, má tam být $this->id, ale v actionEditBox($id) jsem musel přidat $this->id = $id;.

ViPEr*CZ*
Člen | 822
+
0
-

Jsem říkal, že to nenajde žádný řádek :-) Ta privátní proměnná id není ani potřeba pokud s ní nějak dál nepracuješ, stačí použít jen tu co dostane actionEditBox.