Empfehlungen: Erweiterte Suche

ID statt dahinterliegender Name wird ausgegeben

Datenbankobjekte strukturieren und validieren

ID statt dahinterliegender Name wird ausgegeben

Beitragvon doc_snyder » Do 1. Okt 2009, 12:05

Hallo Leute,

ich habe folgendes Problem. Habe ein Beispiel aus O'Reilly Buch, in dem eine Datenbanktabelle mittels einer HTML-Tabelle ausgegeben werden soll. Ich habe auch das zugehörige Bsp von der Buch-HP runtergeladen -> selber Fehler. Da ich jedoch schon auf mehrere Fehler während des Lesens draufgekommen bin, trau ich dem Buch nicht mehr so ganz...
also ich hab folgende zwei Tabellen:

CREATE TABLE IF NOT EXISTS `companies` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
`contact_person` varchar(128) DEFAULT NULL,
`address` varchar(128) NOT NULL,
`city` varchar(128) NOT NULL,
`phone` varchar(128) NOT NULL,
`email` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

CREATE TABLE IF NOT EXISTS `jobs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL,
`title` varchar(128) NOT NULL,
`description` text NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

die zugehörigen models:

Code: Alles auswählen
class Company extends Appmodel
{
    var $name = 'Company';
    #var $hasMany = array('Job');
    var $hasMany = array('Job'=>array(
            'ClassName' => 'Job',
            'foreignKey'=>'company_id')
        );
}


Code: Alles auswählen
<?php
class Job extends AppModel {
var $name = 'Job';
#var $belongsTo=array('Company');
var $belongsTo = array('Company'=>array(
            'ClassName' => 'Company',
            'foreignKey'=>'company_id')
        );
?>


die entsprechende Action im jobs_controller:
Code: Alles auswählen
function table_jobs()
    {
        $jobs = $this->Job->find('all');
        $jobs = Set::extract($jobs,'{n}.Job');
        $this->set('jobs',$jobs);
    }


die view dazu:
Code: Alles auswählen
<table>
<?php
    echo $html->tableHeaders(
    array('id',
                'Firma',
                'Titel',
                'Beschreibung',
                'Angebot vom',
                'zuletzt aktualisiert')
    );
    echo $html->tableCells($jobs);
?>
</table>


ergibt diese Ausgabe:

screenshot_jobs.png
screenshot_jobs.png (92.57 KiB) 195-mal betrachtet


Ich dachte, durch die Zuweisung zum Fremdschlüssel im Model, kann CakePHP dies automatisch so auflösen. Statt Firma "3" sollte zB "Volkswagen AG" stehen.
Was mach ich falsch??

Vielen Dank schon mal jetzt!
doc_snyder
 
Beiträge: 3
Registriert: Do 1. Okt 2009, 11:41

Re: ID statt dahinterliegender Name wird ausgegeben

Beitragvon Mathias » Do 1. Okt 2009, 12:35

Füge doch mal var $displayField = 'name'; dem Model Company hinzu.

Eventuell muss du eine Rekursionsstufe tiefer. Wie sieht denn die MySQL-Abfrage aus?
cheers
Benutzeravatar
Mathias
 
Beiträge: 225
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.x
OS: OS X 10.6.x

Re: ID statt dahinterliegender Name wird ausgegeben

Beitragvon doc_snyder » Do 1. Okt 2009, 14:14

Mathias hat geschrieben:Füge doch mal var $displayField = 'name'; dem Model Company hinzu.

Eventuell muss du eine Rekursionsstufe tiefer. Wie sieht denn die MySQL-Abfrage aus?


vielen Dank erstmal für deine Bemühungen.
hab deine zwei Anmerkungen nochmal extra spezifiziert, obwohl sie glaub ich standardmäßig auch so gesetzt werden.

Hier ist noch die Ausgabe mit Array und SQL:
snapshot_query.png
snapshot_query.png (116.4 KiB) 189-mal betrachtet


wie gesagt -> unter Firma steht noch immer die ID und nicht der Name der 'companies'-Tabelle...
doc_snyder
 
Beiträge: 3
Registriert: Do 1. Okt 2009, 11:41

Re: ID statt dahinterliegender Name wird ausgegeben

Beitragvon mbrod » Fr 2. Okt 2009, 09:19

Durch die Zeile
Code: Alles auswählen
$jobs = Set::extract($jobs,'{n}.Job');
werden die Daten von Company unterdrückt, sodass Du im View nicht mehr darauf zugreifen kannst. Nach löschen der Zeile solltest Du etwa so etwas bekommen:
Code: Alles auswählen
Array
(
    [0] => Array
        (
            [Job] => Array
                (
                    [id] => 1
                    [company_id] => 1
                    [title] => Elektroingenieur
                    [description] =>
                    [created] => 2009-10-02 09:26:01
                    [modified] => 2009-10-02 09:26:01
                )

            [Company] => Array
                (
                    [id] => 1
                    [name] => Volkswagen
                    [contact_person] =>
                    [address] =>
                    [city] =>
                    [phone] =>
                    [email] =>
                )

        )

)

Das ist erst mal Vorraussetzung. Ob man dies so ohne weiteres (und so einfach) im View mit $html->tableHeaders und $html->tableCells($jobs) weiter verarbeiten kann, weiß ich nicht. In der Regel backe ich so was mit der Konsole und ändere dann im View entsprechend die Zellen.
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: ID statt dahinterliegender Name wird ausgegeben

Beitragvon doc_snyder » Fr 2. Okt 2009, 13:35

danke - du hast natürlich recht, die View kann nur mit den Daten arbeiten, die sie bekommt. Von daher kommen schon unzureichende Daten aus dem Controller. Das Problem ist, dass mein Array anders als das aussieht, das im Beispiel des O'Reilly Buchs drin ist.

Dort bekommen sie durch folgende Zeilen im Controller:

Code: Alles auswählen
function table_jobs()
    {
        $jobs = $this->Job->find('all');
        $jobs = Set::extract($jobs,'{n}.Job');
                $this->set('jobs',$jobs);
    }
 


folgendes Array:
Code: Alles auswählen

Array
(
    [0] => Array
        (
            [id] => 1
            [company] => Volkswagen AG
            [title] => Programmierer/In
            [description] => Ok, das ist eine Beschreibung, super, funktionierts? - ja, und wie
            [created] => 2009-09-28 21:32:00
            [modified] => 2009-10-01 09:39:34
        )

    [1] => Array
        (
            [id] => 2
            [company] => Cake Software Foundation Inc.
            [title] => cakePHP-Entwickler
            [description] => Hier steht eine Job-Beschreibung
            [created] => 2009-09-08 21:32:00
            [modified] => 2009-10-01 09:39:52
        )
usw ........
 


ich bekomme durch die gleichen Zeilen dieses Array:

Code: Alles auswählen

Array
(
    [0] => Array
        (
            [id] => 1
            [company_id] => 3
            [title] => Programmierer/In
            [description] => Ok, das ist eine Beschreibung, super, funktionierts? - ja, und wie
            [created] => 2009-09-28 21:32:00
            [modified] => 2009-10-01 09:39:34
        )

    [1] => Array
        (
            [id] => 2
            [company_id] => 2
            [title] => cakePHP-Entwickler
            [description] => Hier steht eine Job-Beschreibung
            [created] => 2009-09-08 21:32:00
            [modified] => 2009-10-01 09:39:52
        )
etc ....
 


Wie man sieht wird im oberen Array automatisch auf das Feld "name" der Tabelle "companies" gemappt, während bei mir die ganze "jobs"-Tabelle im Array abgebildet ist. Ja und wie gesagt -> "displayField" ist in den Models auf "name" gesetzt.

Ich würd einfach nur gerne verstehen wollen, wie die das im Buch hinkriegen. Ich weiß, ich könnt das Array per Hand so zusammensetzen wie ich es brauche, nur geht es ja anscheinend eleganter?!?!
Vl weiß noch wer einen Tipp, DANKE!!!
doc_snyder
 
Beiträge: 3
Registriert: Do 1. Okt 2009, 11:41

Re: ID statt dahinterliegender Name wird ausgegeben

Beitragvon mbrod » Fr 2. Okt 2009, 15:15

Wie man sieht wird im oberen Array automatisch auf das Feld "name" der Tabelle "companies" gemappt

Ich habe mir das im Buch jetzt auch noch mal angeschaut und vermute fast, dass da gar nichts "automatisch" gemappt wurde, sondern einfach der frühere Stand der Jobs-Tabelle benutzt wurde. Also vor dem Schritt "Model-Relationen herstellen" im Kapitel 5.
Sicher ist, dass im Controller die Daten zur Verfügung gestellt werden müssen. Habe mir daraufhin auch die Set-Klasse mal angeschaut (API und Buch Kapitel 17). Da kann man ja schon einiges mit den Arrays anstellen. (Merke ich mir mal.) Habe ein paar Sachen ausprobiert, bin dann aber zu der Erkenntnis gelangt, dass man auch nicht mit ein paar Befehlen auskommt, sondern wohl doch auch Schleifen bilden muss. Und das ist ja dann auch nicht gerade "elegant".
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 Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast