Převedení SQL řetězce na DibiFluent

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

Dobrý den,

chtěl bych se vás zeptat, zda někdo nevíte, jak v dibi převést klasický sql dotaz tak, aby byl převeden na dibifluent a dalo se s ním nadále podle toho pracovat?

Mám v databázi uložené sql řetězce, které potřebuji, aby byly zpracovány griditem.
Dělám si obecně fungující model, abych nemusel pro každý datagrid dělat zvláštní model.

Myslel jsem něco takovéhoto:

$db->command()->clause("Select * from gui_users")

Po bližším zkoumání jsem ale zjistil, že to takto nepůjde. Potřeboval bych tedy nějakou překladovou funkci, která by mi zajistila správný převod.

Za každou radu předem děkuji.

Ot@s
Backer | 476
+
0
-

Zjednoduši si to pomocí dočasného pohledu (koncept z hlavy):

$vname = 'tmp'.mt_rand(5, 15); // zajisteni unikatniho nazvu pohledu
$sql = 'Select * from gui_users'; // onen SQL z databaze
// premena SQL na dibi fluent
\dibi::query('create temporrary view '.$vname.' as '.$sql);
$df = \dibi::select(*)->from($vname);
// v $df je to co potrebujes
darthcz
Člen | 113
+
0
-

Takto to skutečně funguje. Níže trošku komplexnější příklad (v praxi nebude tenhle join použit).

Ještě bych se chtěl zeptat, jaký je rozdíl mezi create view a create temporary table? create temporary view nejde.

Děkuji moc.

public function __construct(\DibiConnection $db, $sql = null)
{
	//get all rows from table
	$vname = 'tmp'.mt_rand(5, 15); // zajisteni unikatniho nazvu pohledu
	$sql = 'Select * from gui_users u'; // onen SQL z databaze

	// premena SQL na dibi fluent
	$db->query('create temporary table '.$vname.' as '.$sql);


	parent::__construct($db->select('*')->from($vname)->join('gui_users_roles r')->on("r.user_id = $vname.id")->where("$vname.id = 3"));

}
Ot@s
Backer | 476
+
0
-

darthcz napsal(a):

Ještě bych se chtěl zeptat, jaký je rozdíl mezi create view a create temporary table? create temporary view nejde.

TEMPORARY pohled je dočasný, tj. je k dispozici po dobu připojení k databázi a pouze pro požadavek, který ho vytvořil (pak ho db server automaticky smaže). Např. postgresql ho podporuje. U mysql se na to musí malinko jinak.

Milo
Nette Core | 1283
+
0
-

Také bys to mohl udělat subselectem, ale tam bude u MySQL problém s používaním indexů.

$sql = 'SELECT col1, col2 FROM table WHERE xy = 123';

$fluent = dibi::select('*')->from('(%SQL)', $sql);