DIBI syntaxe v dotazu query()

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

Zdravím,

prosil bych o radu, s nette víceméně začínám a dříve jsem využíval DIBI, aktuálně potřebuji udělat složitější dotaz na které nestačí konstrukce, takže si ho volám normálě přes ->query(), dotaz chci mít napsaný v DIBI stylu, otázka jestli je to možné. Pokud ne nastává ještě jeden „problém“. Příklady jsem hodně zjednodušil.

1) S DIBI syntaxí

<?php
$sql = "SELECT * FROM %n WHERE [col] = %i OR [col_2] = %i";
$this->context->query($sql, 'table_name', 1, 2);
?>

2) Bez DIBI syntaxe

<?php
$sql = "SELECT * FROM %s WHERE `col` = %d OR `col_2` = %d";
$this->context->query($sql, 'table_name', 1, 2);
?>

Tyto dva příklady mně nejdou, druhý příklad jde až v okamžiku, kdy to zapíšu takto:
3) Bez DIBI syntaxe se sprintf

<?php
$sql = "SELECT * FROM %s WHERE `col` = %d OR `col_2` = %d";
$this->context->query(sprintf($sql, 'table_name', 1, 2));
?>

…ale přitom v metodě query($statement) na 78 řádku \Nette\Database\Context je metoda func_get_args(), která počítá i s variantou více parametrů a v tom případě to bere, že první je SQL dotaz a další jsou argumenty, ale stejně mi to spadne.

Takže má otázka zní:
1) Proč mi to nechce spolupracovat a vzít neomezený počet argumentů?
2) Lze použít dibi syntax?

Díky všem za případnou pomoc :)

Editoval martin20a (6. 3. 2014 17:54)

greeny
Člen | 405
+
0
-

Nette\Database používá jednotný zástupný znak ? místo %cosi

Navíc do Nette se dá dibi přidat, viz https://doc.nette.org/cs/database#…

martin20a
Člen | 8
+
0
-

greeny napsal(a):

Nette\Database používá jednotný zástupný znak ? místo %cosi

Navíc do Nette se dá dibi přidat, viz https://doc.nette.org/cs/database#…

Ahoj, díky za reakci, nějak jsem tento článek proletěl a neuvědomil si, že to je to co hledám. Nicméně na základě článku bych se zeptal jestli správně chápu, že nahrazením za dibi se přestanou cachovat výsledky a už nebudu moct naplno využívat výhody nettedb a nebo jen to dibi bude působit jako preprocessor nettedb?

A ještě tedy jestli nevíš proč mi nejde příklad č.2 z prvního postu :) Díky

edit: na dibi se mě především líbí zápis názvů slopců [col] je to rychlejší a přehlednější (dle mého) než col.

Editoval martin20a (6. 3. 2014 18:33)

greeny
Člen | 405
+
0
-

V NetteDb mi přijde lepší zápis stylu

<?php
$rows = $connection->table('table')
->where('a', 'val')
->where('b < ?', 4)

foreach($rows as $row) ...
?>

Nahrazením za dibi přijdeš o všechny výhody NetteDb, prostě místo toho budeš mít dibi.

Příklad číslo 2 by měl fungovat takto:

<?php
$sql = "SELECT * FROM table WHERE `col` = ? OR `col_2` = ?";
$this->context->query($sql, 1, 2);
?>
martin20a
Člen | 8
+
0
-

Díky za pomoc :)

ten lepší zápis tak dělám, ale pokud je tam cokoliv mimo AND tak to pokud vím nejde udělat takto elegantně :)

David Matějka
Moderator | 6445
+
0
-

kdyz chces v NDBT pouzit OR, udelej

->table('table')->where('col = ? OR col_2 = ?', 1, 2)