Výběr dat z db pomocí dibi, ale sloupec id je null
- Mesiah
- Člen | 240
Dobrý den,
prosím Vás, vybírám data z databáze. Všechny sloupce se vyberou
správně, ale jen sloupec id
je null.
Jsem z toho celkem zaskočený, nevím jestli je to třeba tím, že jako db
engine mam InnoDB a id používám jako vzdálený klíč. Může to být tím?
:-O
Volání provádím pomocí:
<?php
$product = $this->products->getProduct(max(0, $id))->execute()->setRowClass('Product')->fetch();
dump($product);
?>
a dostávám:
object(Product) (15) {
"id" => NULL
"producer" => string(9) "BingoBing"
"type" => string(4) "AS23"
"url" => NULL
"sex" => string(6) "unisex"
"product-num" => string(7) "aa23oo1"
"count" => string(2) "14"
"price" => string(2) "79"
"date" => string(19) "2010-09-01 11:33:20"
"description" => string(35) "Naušnice, kterou jsem si vymyslil."
"enable" => string(3) "yes"
"id_product" => NULL
"id_group" => NULL
"name" => NULL
"id_category" => NULL
}
Products.php
<?php
class Products
{
private function sqlFactory()
{
return dibi::select('*')->from('products')
->leftJoin('[product-group]')->on('[products.id] = [product-group.id_product]')
->leftJoin('[groups]')->on('[groups.id] = [product-group.id_group]')
->leftJoin('[product-category]')->on('[products.id] = [product-category.id_product]')
->leftJoin('[categories]')->on('[categories.id] = [product-category.id_category]');
}
public function getProduct($id)
{
return $this->sqlFactory()->where('[products.id] = %i', max(0, $id));
}
public function getProducts()
{
return $this->sqlFactory();
}
}
?>
product.php
<?php
class Product extends DibiRow
{
public function __construct($arr = array())
{
return parent::__construct($arr);
}
public function getGroups()
{
return dibi::select('*')->from('groups')->leftJoin('[product-group]')->on('[groups.id] = [product-group.id_group]')->where('[product-group.id_product] = %i', $this->id)->execute()->setRowClass('Group');
}
public function getCategories()
{
return dibi::select('*')->from('categories')->leftJoin('[product-category]')->on('[categories.id] = [product-category.id_categry]')->where('[product-category.id_product] = %i'. $this->id)->execute()->setRowClass('Category');
}
public function create()
{
return dibi::insert('products', (array) $this)->execute();
}
public function save()
{
return dibi::update('products', (array) $this)->where('[id] = %i', $this->id)->execute();
}
public function delete()
{
return dibi::delete('products')->where('[id] = %i', $this->id)->execute();
}
}
?>
Dělám něco špatně, nebo jde o mou neznalost?
- westrem
- Člen | 398
Kod vyzera byt v poriadku, skus si dumpnut query a pozriet (napr. pomocou
Adminer-a alebo phpMyAdmina) co ti skutocne vrati SQL. Ocividne medzi vysledkom
je aj column id
ale podla mna musi byt NULL
uz v DB,
kedze ako konstruktor volas konstruktor od DibiRow a ten pozostava len zo simply
priradenia hodnot klucom.
PS:
- uz vo funkcii
getProduct
mas sanitaciu$id
, nepotrebujes ju teda zdvojovt aj pri volani ;) - je nejaky dovod, ze explicitne mas nadefinovany konstruktor ked potom aj tak
iba volas
parent::__construct()
?
- marek.dusek
- Člen | 99
A nemuze to byt tim, ze to nulove ID je ve skutecnosti z jine najoinovane tabulky?
Aneb proc je pruda pojmenovavat PK vzdy generickym „ID“ ;)
- westrem
- Člen | 398
marek.dusek napsal(a):
A nemuze to byt tim, ze to nulove ID je ve skutecnosti z jine najoinovane tabulky?
Aneb proc je pruda pojmenovavat PK vzdy generickym „ID“ ;)
Ha! To moze byt vcelku ono .. nejak som si neuvedomil, ze tam Mesiah vola
select('*')
..
Na 99.9% teda tipujem, ze mas recht, MySQL pri tolkych ID
nevie,
ktore ma programator na mysli a pouzije proste nejake.
Nesuhlasim vsak s tym, ze pomenovanie generickym ID
je
„pruda“, je to bezna konvencia. Pruda alebo skor neokrochanost je prave
volat select('*')
. To je nieco co by programator mal pisat len ked
velmi presne vie preco to robi a nie z lenivosti.