Formulář – SelectBox se záznamy z databáze (pouze jednou)
- Desttro
- Člen | 126
Zdravím,
potřeboval bych pomoct s tvorbou formuláře. Mám tabulku, kde se z XML
importují jednotlivé záznamy automobilů, ve formě: ID, výrobce, model,
typ, barva, … Poradil jsem si s vytažením všech výrobců do selectboxu,
bohužel to vytáhne všechny záznamy, takže třeba Mercedes-Benz tam je 5×,
BMW 6× atd. Potřeboval bych to pouze 1×.
V čistém PHP a MySQL bych si asi nějak poradil pomocí cyklu atd, ale nevím
jak v Nette.
Děkuji za váš čas a pomoc.
zde je kód:
public function selectManufacturer() {
$row = $this->database->table('cars')
->select('id, manufacturer')
->order('manufacturer ASC')
->fetchPairs('id', 'manufacturer');
return ($row) ? $row : NULL;
}
public function selectModel() {
$row = $this->database->table('cars')
->select('id, model')
->order('model ASC')
->fetchPairs('model', 'model');
return ($row) ? $row : NULL;
}
protected function createComponentSearchForm() {
$form = new Nette\Application\UI\Form;
$manufacturer = HomepagePresenter::selectManufacturer();
$model = HomepagePresenter::selectModel();
$form->addSelect('manufacturer', 'Výrobce')
->setItems($manufacturer)
->setPrompt('Vyberte značku');
$form->addSelect('model', 'Model')
->setItems($model);
$form->addSubmit('submit', 'Vyhledat');
return $form;
}
- Mysteria
- Člen | 797
public function selectModel() {
$row = $this->database->table('cars')
->select('id, DISTINCT(model) model')
->order('model ASC')
->fetchPairs('model', 'model');
return ($row) ? $row : NULL;
}
Případně by ještě šlo udělat ->group(‚model‘), co bude výkonnostně lepší netuším. :)
Editoval Mysteria (27. 5. 2014 0:02)
- Desttro
- Člen | 126
Mysteria napsal(a):
public function selectModel() { $row = $this->database->table('cars') ->select('id, DISTINCT(model) model') ->order('model ASC') ->fetchPairs('model', 'model'); return ($row) ? $row : NULL; }
Případně by ještě šlo udělat ->group(‚model‘), co bude výkonnostně lepší netuším. :)
Děkuji za radu, zkusil jsem to, ale vyhodilo to chybu se syntaxí:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an
error in your SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near ‚DISTINCT(model
)
model
FROM cars
ORDER BY model
ASC‘ at
line 1
SQL: SELECT id
, DISTINCT(model
)
model
FROM cars
ORDER BY model
ASC
Tak jsem zkusil tyto varianty, ale furt nic:
->select('DISTINCT id, (model) model')
->select('DISTINCT (model) model, id')
->select('DISTINCT ON (model) model, id')
->select('DISTINCT ON id, (model) model')
- Oli
- Člen | 1215
Tenhle format funguje?:
public function selectManufacturer() {
$row = $this->database->table('cars')
->select('id, DISTINCT manufacturer') // pripadne DISTINCT (manufacturer)
->order('manufacturer ASC')
->fetchPairs('id', 'manufacturer');
return ($row) ? $row : NULL;
}
viz. w3school. Je pravda, ze ten clanek co jsem postnul predtim nebyl zrovna nejprehlednejsi :-)
- Desttro
- Člen | 126
Oli napsal(a):
Tenhle format funguje?:
public function selectManufacturer() { $row = $this->database->table('cars') ->select('id, DISTINCT manufacturer') // pripadne DISTINCT (manufacturer) ->order('manufacturer ASC') ->fetchPairs('id', 'manufacturer'); return ($row) ? $row : NULL; }
viz. w3school. Je pravda, ze ten clanek co jsem postnul predtim nebyl zrovna nejprehlednejsi :-)
Tohle taky hlásí chyba s SQL syntaxí
- Desttro
- Člen | 126
mystik napsal(a):
A co pomocí GROUP BY:
$row = $this->database->table('cars') ->select('model') ->order('model ASC') ->group('model') ->fetchPairs('model', 'model');
Super, funguje! Díky moc, a omlouvám se, že jsem přehlídl řešení od Mysteria, kde bylo řešení už napsáno, taky pomocí order. Díky moc!
- s4muel
- Člen | 92
kedze DISTINCT limituje vysledky, tak pre viac rovnakych zaznamov
s rozdielnym id sa nevie rozhodnut, ktore id ma nechat (co je logicke)
napr ked mas tabulku ako toto:
________
|1|audi|
|2|audi|
|3|audi|
|4|audi|
--------
ked spravis
SELECT id, DISTINCT manufacturer
tak aky by si ocakaval vysledok (pre stlpec id)? tazko povedat. preto ma DISTINCT najma vyznam pri vytahovani jedneho stlpca, pripadne len tych stlpcov, ktore su zhodne pre vsetky zaznamy s rovnakym manufacturer. taka trochu analogia s GROUP BY.
vlastnymi slovami: mozes spravit select, aky chces, ale klucove slovo DISTINCT uvedene za SELECT ti z vysledku odstrani identicke riadky.
cize:
$this->database->table('cars')
->select('DISTINCT model')
->order('model ASC')
->fetchPairs('model', 'model');
by malo fungovat podla predstav
Editoval s4muel (27. 5. 2014 10:48)
- Desttro
- Člen | 126
s4muel napsal(a):
kedze DISTINCT limituje vysledky, tak pre viac rovnakych zaznamov s rozdielnym id sa nevie rozhodnut, ktore id ma nechat (co je logicke)
napr ked mas tabulku ako toto:________ |1|audi| |2|audi| |3|audi| |4|audi| --------
ked spravis
SELECT id, DISTINCT manufacturer
tak aky by si ocakaval vysledok (pre stlpec id)? tazko povedat. preto ma DISTINCT najma vyznam pri vytahovani jedneho stlpca, pripadne len tych stlpcov, ktore su zhodne pre vsetky zaznamy s rovnakym manufacturer. taka trochu analogia s GROUP BY.
vlastnymi slovami: mozes spravit select, aky chces, ale klucove slovo DISTINCT uvedene za SELECT ti z vysledku odstrani identicke riadky.
cize:
$this->database->table('cars') ->select('DISTINCT model') ->order('model ASC') ->fetchPairs('model', 'model');
by malo fungovat podla predstav
Děkuji za vysvětlení, už to chápu, taky funguje :)