Update řádku v modelové vrstvě
- Grelek
- Člen | 233
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
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.
- ViPEr*CZ*
- Člen | 822
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
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ě, dump
nul jsem i proměnné formuláře, předají se
správně, tak jsem z toho zmatený.
- vvoody
- Člen | 910
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
- Grelek
- Člen | 233
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)
.
- Grelek
- Člen | 233
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
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
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;
.