Nette\Database – primární klíč nad více sloupci
- spidy
- Člen | 55
Když mám v tabulce definovaný primární klíč nad více sloupci,
vyhazuje Nette\Database výjimku
Nette\NotSupportedException: Table permission does not have any primary key.
například při procházení pomocí foreach. Asi není co dodat, takže se
rovnou zeptám: Dá se s tím něco dělat, nebo si musím zprasit databázi a
přidat do všech spojovacích tabulek sloupec s AI?
- spidy
- Člen | 55
Kód zaslat můžu, ale je takový trochu složitější…
...
$permissions = $this->getPermissions()->where('viewer_id', $user->id)
->where('creator_id NOT IN ?',
$this->getPermissions()->where('viewer_id', $this->identity->id)->select('creator_id')
)
->select('creator_id, '. $this->identity->id. ' AS viewer_id');
$this->connection->beginTransaction();
foreach ($permissions as $permission) {
$this->getPermissions()->insert($permission);
}
...
Chyba nastává u toho foreach…
- ZZromanZZ
- Člen | 87
Myslis pokud mam pole indexovane dle primarniho klice, typicky treba v nejakem gridu a potrebuju se pak dle tohoto primarniho klice odkazat na databazovy radek kvuli editaci ? „idPrvnihoSloupce-idDalsihoSloupce-…atd“ a pak to parsovat ? Jenom tak strilim
Editoval ZZromanZZ (2. 9. 2012 23:13)
- castamir
- Člen | 629
složený PK by tedy měl být asi v té metodě jako asociativní pole, že? takže by neměl být problém to automaticky převést na where() v případě, že parametr find() resp get() bude pole (is_array() === TRUE)
EDIT:
public function find($key) {
if (is_array($key)) {
return $this->where($key);
} else {
return $this->where($this->primary, $key);
}
}
public function get($key) {
$clone = clone $this;
if (is_array($key)) {
$clone->where($key);
} else {
$clone->where($this->primary, $key);
}
return $clone->fetch();
}
Výše zmíněné řešení je ovšem velmi obecné a neručí na vyhledávání pouze podle PK.
Ráno omrknu jak se nastavuje atribut primary a jeho chování u různých tabulek a pak ty 2 metody zkusím doladit…
Editoval castamir (3. 9. 2012 3:05)