Nette\Database – Selection by mohla být víc immutable
- Filip Procházka
- Moderator | 4668
Na Nette\DB mi trošku vadí, že když volám jednotlivé metody nad
Selection
, tak se mi „nabalují“ do jednoho objektu, jako v
DibiFluent
, což není problém do momentu, kdy chci
Selection
použít na něco jiného a musím si ji
vytvářet novou.
Řeším to kvůli tomu, že i dokumentace samotná nabádá předávat jenom jednu tabulku do modelu a to se pak sice chová logicky, ale není to očekávané, ani příjemné. Příklad:
use Nette\Database\Table\Selection;
class NewsArchive extends \BaseControl
{
/** @persistent */
public $page = 1;
/** @var \Nette\Database\Table\Selection */
private $news;
public function __construct(Selection $news)
{
parent::__construct();
$this->news = $news;
}
public function render()
{
$news = clone $this->news;
$paginator = $this['paginator']->getPaginator();
$news->page($paginator->page, $paginator->itemsPerPage);
$this->template->news = $news;
$this->template->render();
}
protected function createComponentPaginator()
{
$paginator = new \ComponentPaginator(10, $this->news->count('id'), $this->page);
$paginator->template->setFile(__DIR__ . '/newsArchive.paginator.latte');
$paginator->template->archive = $this;
return $paginator;
}
}
Jak je vidět, tak si $news
musím prvně naklonovat, abych se
mi to nepralo. Kdyby každé zavolání metody, která ovlivňuje výsledky
(where
, page
, …) vytvářelo nový objekt, tak tento
problém nemám. Ve složitějším modelu bych mohl mít volání filtrování
nad tabulkou a po třech, čtyřech zavolání, bez klonování, by mi to už
nevracelo nic, protože by každá podmínka chtěla něco jiného.
Samozřejmě je to krapet kontraproduktivní, protože si složitějším zápisem můžu vyrobit desítku objektů, které pak hned zahodím, protože je nepotřebuju. A nejsem si jistý, jestli by to nedělalo problémy „magickému selection api“.
Když pominu pár bugů, tak tohle je jediná věc, která mě na api Nette\DB trápí. Máte k tomu někdo nějaký postřeh, nebo nápad?
- nanuqcz
- Člen | 822
Mě osobně by zase přišel matoucí tento kód (kdyby se implementovalo to, co chceš):
$articles = $database->table('article');
$articles->count(); // 100
$articles->where("id", 1);
$articles->count(); // pořád 100
Ale asi to je jen o zvyku, je možné že matoucí to přijde jen mě a „nováčkovi“ (člověku co předtím NetteDB ani dibi neviděl) by to přišlo OK.
Editoval nanuqcz (12. 4. 2012 13:51)
- Filip Procházka
- Moderator | 4668
Ano, to je velká nevýhoda… Ale pokud by to bylo jasně napsané v dokumentaci, tak to nemusí být problém
$articles = $database->table('article');
dump($articles->count()); // 100
$articlesWithIdOne = $articles->where("id", 1);
dump($articlesWithIdOne->count());
Právě kvůli tomuhle bylo téma založeno v „Diskuze o vývoji“ a ne ve „Feature request“ :)
Editoval HosipLan (12. 4. 2012 14:17)
- hrach
- Člen | 1838
Mám rozpracovanou verzi, která to(Selection) objektově čistí. Ani ne tak tvým směrem, Hosiplane. Min. by měla taky fixnout bug, který zminuje nanuqcz. To je samozrejme chyba. Tech chyb tam je (i v aktualnim stable) hodne, aktualne je tam prasackej bug. Snazim se to pomalu vsecko vyresit, ale opravis neco a ono se to rozbije jinde…aaaa!!!
- Filip Procházka
- Moderator | 4668
To znám :) Čistit to po zavolání některých metod mě nenapadlo. To by mohlo taky plnit účel :)
Pokud máš nějaký svůj seznam bugů, píšeš je na nette/issues ? Je to nepravděpodobné, ale může se stát, že by někdo taky chtěl něco opravit sám, kdyby ho to hodně štvalo ;)
Editoval HosipLan (12. 4. 2012 15:43)
- Honza Marek
- Člen | 1664
Podle mě se to v současné chvíli chová dobře, jen jsou blbě příklady.
HosipLan napsal(a):
Čistit to po zavolání některých metod mě nenapadlo. To by mohlo taky plnit účel :)
Jen to ne. Možná účel zmatení nepřítele.
hrach
Pokud umim číst, tak Nanuqcz nezmiňuje současný bug, ale bug, která by nastal, kdyby se vyhovělo Hosiplanovi.
- Patrik Votoček
- Člen | 2221
Stávající řešení mě připadá daleko více OK než navrhovaná změna…
Hosiplan: Selection je vlastně takový QueryBuilder
- Filip Procházka
- Moderator | 4668
Já si taky myslím, že by to bylo hloupé takto upravit ;) Chtěl jsem jen rozpoutat diskuzi.
- David Grudl
- Nette Core | 8227
Honza Marek napsal(a):
Podle mě se to v současné chvíli chová dobře, jen jsou blbě příklady.
Opravil jsem je.