koncept ORM postavenom na skvelom Dibi a inspirovanym Django Model

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

edke napsal(a):
Napriek vsetkemu, co som tu popisal, je zaujem ? Prasknut to na github je najmenej.

Hoj,zajem ;-) Ostatne i z reakci ostatnich jsem usoudil,ze je to zajima,podivuju se,ze ted je to bez reakce ;-)

Honza Kuchař
Člen | 1662
+
0
-

Len mi to stale cele pripada prasacke, ale co uz, som pripraveny na kritiku a aspon sa to takto niekam posunie.

Říkej tomu svézázný styl a bude to v pořádku. ;-) Pokud je fajn návrh, tak to bude fajn.

Dalsi problem vidim v tom, ze to mam tak nejako upravene na moje potreby a instalacia/pouzivanie asi nebudu kazdemu vyhovovat.

To může být dokonce i plus.

Navyse som chcel to pustit von, ked to bude spolupracovat aj s inymi databazami ako postgresql. Ale nato teraz nie je cas.

No mně je to puříkladu jedno, protože nic jiného než pgsql na nové projekty stejně nepoužívám.

Napriek vsetkemu, co som tu popisal, je zaujem ? Prasknut to na github je najmenej.

Řekl bych, že ano. Ale pokud to není odladěné, či je to ve fázi nějaké té pre-alfa, dal bych to jako extra větvi na githubu – stejně jako Nella.

edke
Člen | 198
+
0
-

Ok, tak kto ma zaujem, je to na github-e:

https://github.com/Edke/PerfORM
https://github.com/…fORM-Console

Prave tento tyzden som riesil, co s tym dalej, najradsej by som to cele prepisal. Ale asi to je takto lepsie, nech sa nato pozrie aj ine oko a dufam, ze poradite co s tym dalej :)

Este co sa tyka diskusie o PerfORM (ak nejaka bude), dumem, kam to umiestnit, predsa len nechcem tu spamovat Davidovi forum o Nette. Nemate nejaky navrh ? Mozno najlepsie priamo na github-e ako code comments ? Alebo Google Groups ?

v6ak
Člen | 206
+
0
-

Ještě bych dal jednu inspiraci: CRUD Controller (Presenter): http://www.playframework.org/…n/1.0/guide7

lucass
Člen | 89
+
0
-

Zdary Edke,

tak jsem vyzkoušel Tvůj skvělý výtvor, akorát jsem narazil na nějaká úskalí:

  • při definici cizího klíče v tabulce, která tvoří hierarchickou strukturu (např. kategorie, sitemap atp., kde cizí klíč odkazuje na primární klíč stejné tabulky), dojde k zacyklení skriptu,
  • vygenerované tabulky s cizími klíči nevytváří vazby (v metodě addForeignKeyField() je zakomentován řádek $this->depends[]= $reference;, v čemž to zřejmě bude),
  • nenašel jsem (možná přehlédl) způsob, jak vytvořit PerfORM model, který chci mít v jiném než public schématu, lze to?

Posílám ještě své testovací modely Sitemap, Privilege a Resource, kde jsem na zmíněné narazil:

<?php

abstract class PerfORMSitemap extends PerfORM {

    protected function setup() {
    	$this->addForeignKeyField('sitemap', 'Sitemap');
    	$this->addForeignKeyField('resource', 'Resource')->addIndex();
    	$this->addForeignKeyField('privilege', 'Privilege')->addIndex();
	$this->addBooleanField('is_visible')->setNotNullable();
	$this->addDateTimeField('modified_on')->enableAutoNow()->setNotNullable();
	$this->addDateTimeField('created_on')->enableAutoNowAdd()->setNotNullable();
	$this->addBooleanField('is_required')->setNotNullable();
    }

    public function __toString() {
		return '';
    }

}

?>
<?php
abstract class PerfORMResource extends PerfORM {

    protected function setup() {
	$this->addCharField('presenter_name', 50)->setNotNullable();
    }

    public function __toString() {
	return $this->presenter_name;
    }

}
?>
<?php
abstract class PerfORMPrivilege extends PerfORM {

    protected function setup() {
	$this->addCharField('action_name', 50)->setNotNullable();
    }

    public function __toString() {
	return $this->action_name;
    }

}
?>

EDIT: Doplnění bodu 2), tj. generování cizích klíčů a vytvoření CONSTRAINTS

Ještě jsem to testoval a zjistil jsem, že cizí klíče se vygenerují jen tehdy, pokud už tabulky, na které odkazují, jsou již v databázi. Postup tedy musí být takový, že:

  1. nejprve vytvořím modely pro tabulky, na které se chci odkazovat (v našem případě PerfORMResource a PerfORMPrivilege),
  2. spustím syncdb,
  3. vytvořím další model pro tabulku, z níž je odkazováno (PerfORMSitemap),
  4. spustím syncdb.

Zkoušel jsem ještě takovou variantu:

  1. vytvořím všechny tři, přičemž PerfORMSitemap zatím bez cizích klíčů a odkazů na Resource a Privilege,
  2. spustím syncdb,
  3. dopíšu cizí klíče do PerfORMSitemap,
  4. syncdb.

To sice proběhne, ale právě v tomto případě nenadefinuje CONSTRAINTS, pouze přidá nové sloupce.

Editoval lucass (5. 7. 2010 13:41)

lucass
Člen | 89
+
0
-

Ještě jsem našel další chybku:

  • když přidáš cizí klíč např. $this->addForeignKeyField('resource', 'Resource');, kdy se při generování do databáze automaticky vytvoří prefix id_, tj. id_resource, a tento sloupeček pak později chceš z PerfORM modelu odstranit, tak je vyhozena výjimka, že v žádný sloupeček resource v daném table není, tj. vygenerované SQL s tímto prefixem nepočítá, viz následující SQL:
ALTER TABLE "sitemap"
    DROP COLUMN "resource"; // místo id_resource

Editoval lucass (5. 7. 2010 12:14)