Nette\Database – primární klíč nad více sloupci

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

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?

uestla
Backer | 796
+
0
-

Zatím to řeším tak, že místo find($id) používám where se všemi sloupci, které tvoří primární klíč. Kdybys poslal kód, ve kterém získáváš data, určitě bychom něco vymysleli…

spidy
Člen | 55
+
0
-

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…

spidy
Člen | 55
+
0
-

Tak zatím to řeším pomocí $connection->query() a ručně napsaným SQL. Doufám, že bude tento nedostatek brzy odstraněn :).

hrach
Člen | 1834
+
0
-

Primarni klic nad vice sloupci bude podporovan az v dalsi verzi nette (tzn. az to naprogramuju…) ;)

ZZromanZZ
Člen | 87
+
0
-

Jak je na tom podpora primarniho klice nad vice sloupci nyni ?

hrach
Člen | 1834
+
0
-

Sypu si popel na hlavu – neni, ale zrovna dnes sem si rikal, ze bych to uz mohl udelat. Nejvetsim problemem je, ze proste nelze jako klic pole pouzit pole – tedy kompozitum priparnich hodnot.

ZZromanZZ
Člen | 87
+
0
-

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)

hrach
Člen | 1834
+
0
-

Nejde ani tak o grid, jako ze toto vyuzivat nette database interne a je to celkem zasadni. Co kdyz bude nejaky primarni klic string a bude obsahovat „1–2“? Chce to vice promyslet no…

castamir
Člen | 629
+
0
-

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)