Nette\Database – Selection by mohla být víc immutable

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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 | 1822
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Já si taky myslím, že by to bylo hloupé takto upravit ;) Chtěl jsem jen rozpoutat diskuzi.

Jan Tvrdík
Nette guru | 2595
+
0
-

imho pokud funguje správně clone, tak to není problém.

David Grudl
Nette Core | 7790
+
0
-

Honza Marek napsal(a):

Podle mě se to v současné chvíli chová dobře, jen jsou blbě příklady.

Opravil jsem je.