Empfehlungen: Erweiterte Suche

find() bei zwei verbundenen Tabellen

Daten auslesen, verarbeiten und den Views übergeben

find() bei zwei verbundenen Tabellen

Beitragvon Kekskruemel » Di 23. Nov 2010, 21:53

Hallo,

ich habe zwei Datenbanktabellen miteinander verbunden im Model. "Station" und "Price". Wenn ich nun mit Recursive=2 eine find() Abfrage mache, dann schreibt es mir nun "FROM Station" hin, aber das "AND Price" fehlt dabei.
Woran kann dies liegen oder an was muss ich dabei noch denken?

Der Code:
Code: Alles auswählen
                 $stations = $this->Station->find('all', array(
                         'order' => array(
                                 'Price.value','Price.created'),
                         'conditions' => array(
                                 'and' => array(
                                         'or' => array(
                                                 'Station.city LIKE' => $this->data['Station']['city'],
                                                 'Station.postcode LIKE' => $this->data['Station']['city'])
                                         ),
                                         'Price.petrol_id =' => $this->data['Station']['petrol_id'])
                                         ));


Die generierte SQL:
Code: Alles auswählen
SELECT `Station`.`id`, `Station`.`modified`, `Station`.`name`, `Station`.`adress`, `Station`.`postcode`, `Station`.`city`, `Station`.`active`, `Station`.`land`, `Station`.`sm`, `Station`.`info`, `Station`.`money`, `Station`.`opentimesweek`, `Station`.`opentimessaturday`, `Station`.`opentimessunday`, `Station`.`pic`, `Station`.`tel`, `Station`.`fax`, `Station`.`mail`, `Station`.`web`, `Station`.`zugriffe`, `Station`.`breite`, `Station`.`laenge` FROM `stations` AS `Station` WHERE ((`Station`.`city` LIKE 'Hamburg') OR (`Station`.`postcode` LIKE 'Hamburg')) AND `Price`.`petrols_id` = '1' ORDER BY `Price`.`value` ASC, `Price`.`created` ASC


Die Fehlermeldung:
Code: Alles auswählen
1054: Unknown column 'Price.petrols_id' in 'where clause'
Warning (512): SQL Error: 1054: Unknown column 'Price.petrols_id' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 681]
Kekskruemel
 
Beiträge: 15
Registriert: Di 16. Nov 2010, 10:45

Re: find() bei zwei verbundenen Tabellen

Beitragvon mbrod » Di 23. Nov 2010, 22:49

Den Fall einer Suchbedingung in einem assoziierten Model hatte ich noch nicht. Könnte mich ja aber auch mal treffen und so habe ich mich auf die Suche gemacht und dieses gefunden:
http://book.cakephp.org/view/1047/Joining-tables
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: find() bei zwei verbundenen Tabellen

Beitragvon Kekskruemel » Mi 24. Nov 2010, 18:53

Vielen Dank für den ersten Tipp. Das hat soweit geholfen.

Nun habe ich ein weiteres - sicherlich mehr gedankliches Problem:

Code: Alles auswählen
                 $options['joins'] = array(
                                 array('table' => 'prices',
                                       'alias' => 'Price',
                                       'type' => 'inner',
                                       'conditions' => array(
                                                       'Station.id = Price.Station_id'
                                                       )
                                       )
                                 );

                 $options['conditions'] = array('and' => array(
                                                           'or' => array(
                                                                   'Station.city LIKE' => $this->data['Station']['city'],
                                                                   'Station.postcode LIKE' => $this->data['Station']['city']
                                                                         ),
                                                           'Price.petrol_id =' => $this->data['Station']['petrol_id'])
                                                         );


                 $options['order'] = array('Price.value DESC','Price.created ASC');
                 $options['recursive'] = 2;
                 $options['group'] = 'Station.id';
                 $stations = $this->Station->find('all', $options);
                 $this->set('stations', $stations);
        }


Er zeigt nun alles soweit an. Ich habe aber bei einigen Stationen mehrere Preise in der Preis-Tabellen gespeichert.
Nun zeigt er mir in der Ergebnistabelle auch mehrere Preise an. Ich will aber nur den von "created" her aktuellste an Preis je Station.

Lasse ich gar den Group by Befehl weg, wird gar dieselbe Station zwei mal angezeigt und je Station dann die beiden Preise.

Wie kann ich das ändern?
Kekskruemel
 
Beiträge: 15
Registriert: Di 16. Nov 2010, 10:45

Re: find() bei zwei verbundenen Tabellen

Beitragvon mbrod » Do 25. Nov 2010, 00:26

Ich sehe zwei Möglichkeiten:
1.) Mit limit die SQL-Abfrage einschränken. (Ich weiß aber konkret nicht wie.)
2.) Durch eine Logik im View nur den ersten Preis anzeigen lassen.

Bei beiden Möglichkeiten müsste dazu im Controller wohl
Code: Alles auswählen
$options['order'] = array('Price.created DESC');
stehen.
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X


Zurück zu Controller

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron