Zvláštní chování Nette\Database při vkládání dat do druhé databáte
- quiced
- Člen | 85
Zdravím,
mám problém s vkládáním dat do druhé databáze. První databázi mám normálně nadefinovanou v config.neon, ale druhé připojení k databázi si generuju dynamicky pomocí této funkce:
public function getShopConnection($shop_id){
$shop = $this->getShopTable()->where('id',$shop_id)->fetch();
$dsn = "mysql:host=" . $shop->db_server . ";dbname=" . $shop->db_name . "";
$user = $shop->db_username;
$password = $shop->db_password;
$prefix = $shop->db_prefix;
$connection_shop = new Connection($dsn, $user, $password);
$database_shop = new Context($connection_shop);
return $database_shop;
}
Problém je v tom, když chci data vkládat, pomocí tohoto dotazu:
$this->productImportRepository->getShopConnection($shop->id)->table('ps_product')->insert(array(
'id_product' => 'DEFAULT',
'id_supplier' => 2,
'id_manufacturer' => 2,
'id_category_default' => 2,
'id_shop_default' => 1,
'id_tax_rules_group' => 1,
'on_sale' => 0,
'online_only' => 0,
'ean13' => 0,
'quantity' => 0,
'minimal_quantity' => 1,
'price' => 495,
'wholesale_price' => 0,
'reference' => 'EEE',
'out_of_stock' => 2,
'active' => 0,
'redirect_type' => 404,
'available_for_order' => 0,
'condition' => 'new',
'show_price' => 1,
'indexed' => 0,
'visibility' => 'none',
'date_add' => $date_add,
'date_upd' => $date_upd
));
protože mi nette hlásí tuto chybu:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ps_product.id' in 'where clause' search►
Ta chyba je správná, protože tabulka ps_product neobsahuje sloupec id, ale id_product. Nejsem si jist, ale myslím, si, že Nette Database si rovnou vybírá ta vložená data nicméně když mám v tabulce ps_product definovaný primární klíč na id_product proč to vybírá podle id?
Do tabulky ps_product to data vloží správně tam problém není, ale ihned po vložení to hodí již míněnou chybu. Když dotaz složím za pomoci query(), tak vše funguje bez chyby, ale je to otravné vypisovat dlouhý insert přes query().
Nevíte někdo kde by mohl být problém? Jinak používám Nette 2.2.7.
Díky za radu.
- David Matějka
- Moderator | 6445
reflection je sluzba zajistujici poskytovani par informaci o databazi –
prave primarni klic, nebo treba informace o relacich (odkud na jakou tabulku
smeruji atd.). Defaultni je „conventional“ reflection, ktera (jak nazev
napovida) se ridi konvencema. Tedy napriklad ze PK je id
a ze
article_id
bude vzdy smerovat na tabulku article
.
Discovered reflection cte tyto informace ze databazoveho schema, takze pozna
spravny PK nebo spravne detekuje vazbu, ktera nedodrzuje konvence (napr. ze
article_id bude smerovat na tabulku page
).
Tohle plati pro 2.2 – v 2.3 doslo k vetsim zmenam.