Proč insert provádí také select
- Myiyk
- Člen | 321
Ahoj,
mám takový menší problém, když provedu insert, tak to udělá samo taky
select. (což nechci)
Můj kod:
/** @var Nette\Database\SelectionFactory */
protected $database;
$this->database->table("category_translate")->insert(array(
'name' => $name,
'language_id' => (int) $lang,
'category_id' => (int) $categoryID,
));
SQL:
INSERT INTO `category_translate` (`name`, `language_id`, `category_id`)
VALUES ('cccc', 1, 26)
SELECT *
FROM `category_translate`
WHERE (`category_id` = 26) AND (`language_id` = 1)
Vždy jsem si myslel že insert by měl pouze vkládat data.
Ještě poznamenám že insert se provádí v transakci a s WRITE zamčenou tabulkou category_translate.
Možná to na to má nějaký vliv.
Nette 2.1-dev (ae086f2)
- Grelek
- Člen | 233
Zkus se podívat
do API a popřemýšlej nad třídou SelectionFactory
, které
se ptáš…
Editoval Grelek (21. 7. 2013 13:53)
- Myiyk
- Člen | 321
Díky za radu
Já to totiž zkopírovat ze sandboxu (řádek 66, je tam taky insert) a neuvažoval jsem nad tím, proč se ta třída tak jmenuje.
Ale má to jednu vadu Nette\Database\Connection::table() is deprecated; use SelectionFactory::table() instead., ale jestli mi ten SelectionFactory dělá při insertu taky select, tak co mám teda použít ???
Editoval Myiyk (21. 7. 2013 14:12)
- Myiyk
- Člen | 321
Abych tedy provedl pouze insert, tak to musím přes connection->query()
?
V Nette 2.1-dev to jinak nejde ?
Já do DB zapisuju v té tabulce do všech sloupců, takže ten select je mi opravdu na nic.
Ten insert si neukládám do proměnné, takže ani na něm potom nic nevolám. Nevím proč to není lazy, že by se ten select volal až kdybych požádal o nějaká data.
Prosím upravte to, vždyť to takhle dvojnásobí čas pro jeden insert. A k tomu NDB neumí insert několika položek v jednom dotazu.
- llook
- Člen | 407
Selection API je takové jakoby hloupé ORM. Na to, co chceš, slouží
právě Connection::exec()
/Connection::query()
a ten
by měl umět i ten vícenásobný insert.
Akorát místo cool zápisu table('name')->insert(array(...)
použiješ méně cool zápis (zato čitelnější)
exec('INSERT INTO `name
', array(…))`…