Formulář – SelectBox se záznamy z databáze (pouze jednou)

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

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;
 }
Oli
Člen | 1215
+
0
-

Tohle nepomůže?

Desttro
Člen | 126
+
0
-

Oli napsal(a):

Tohle nepomůže?

Díky, vypadá že by mohlo, ale jak to mohu napsat do kódu? Jde to nějak jednoduše jako třeba ->limit(x)? Nebo musím jinak? díky

Mysteria
Člen | 797
+
0
-
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
+
0
-

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')
mystik
Člen | 312
+
0
-

A co pomocí GROUP BY:

$row = $this->database->table('cars')
     ->select('model')
     ->order('model ASC')
     ->group('model')
     ->fetchPairs('model', 'model');
Oli
Člen | 1215
+
0
-

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

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

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

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

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 :)