Výběr dat z db pomocí dibi, ale sloupec id je null

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

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
+
0
-

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:

  1. uz vo funkcii getProduct mas sanitaciu $id, nepotrebujes ju teda zdvojovt aj pri volani ;)
  2. je nejaky dovod, ze explicitne mas nadefinovany konstruktor ked potom aj tak iba volas parent::__construct() ?
marek.dusek
Člen | 99
+
0
-

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
+
0
-

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.

Mesiah
Člen | 240
+
0
-

ou… bylo to lenivosti :) Děkuji za radu, dočasně jsem to „řešil“ tak, že jsem striktně předávat id do speciální proměnné… o_O

westrem 1. a 2. – protože mam program, který tohle generuje a lenivost je mrcha… :/

hmm, asi bych měl v mnoho ohledech přehodnotit svůj postoj ;)