2010-12-23 10 views
5

Ich möchte die folgende einfache Beziehung modellieren:CakePHP: Gehört zu Beziehung

Ein Passagier gehört zu einem Auto; Ein Auto hat viele Passagiere.

Die Beifahrertabelle hat eine ID- und Car_id-Spalte, die Car-Tabelle hat eine ID-Spalte.

Meine Modelle wie folgt aussehen:

<?php 
class Passenger extends AppModel { 
    var $name = 'Passenger'; 
    var $belongsTo = 'Car'; 
} ?> 

und

<?php 
class Car extends AppModel { 
    var $name = 'Car'; 
    var $hasMany = array (
     'Passenger' => array (
      'className' => 'Passenger', 
      'foreignKey' => 'car_id' 
     ) 
    ); 
} 
?> 

und mein Add Passagier .ctp wie folgt aussieht:

<?php 
echo $this->Form->create('Passenger'); 
    echo $this->Form->input('car_id'); 
    echo $this->Form->end('Save'); 
?> 

aber wenn ich die Seite zu gelangen ein Passagier, alles, was ich sehe, ist eine leere Dropdown-Box. Gibt es einen zusätzlichen Schritt, um die Dropbox mit allen Autos zu bestücken?

+0

+1 für Kuchen php gute Frage für neue Kuchen php – XMen

Antwort

2

First off, haben Sie vergessen, die belongsTo Beziehung in Ihrem Passagiermodell zu erwähnen:

<?php 
class Passenger extends AppModel { 
    var $name = 'Passenger'; 
    var $belongsTo = array('Car'); 
} 
?> 

Als nächstes wird in der entsprechenden Aktion des Controller, benötigen Sie einen list aller Autos zu erhalten aus der Datenbank und setzen Sie es auf die Pluralform der Variablen des Modells ($ Autos). Sie würden das tun, etwa so:

$cars = $this->Passenger->Car->find('list'); 
$this->set(compact('cars')); 

Dieser wandelt die car_id Eingabefeld in eine Dropdown-Liste mit den bevölkerten Informationen.

HTH.

+0

+1, während ich dies bereits wissen, ist es eine gute Erklärung ist. –

+0

hey in diesem fall muss ich 'Car' modell in controller? –

2

Der Passagier wird nur über das Auto wissen, mit dem er verbunden ist - an dieser Stelle keine.

In der Add-Methode in dem Passagiere Controller tun

$this->Car->find('list');

und das Ergebnis in Ihre Sicht passieren:

$this->set('cars',$cars); 

In der Ansicht gibt den Autos $ Variable als Wert für $ optionen in der felddeklaration:

echo $this->Form->input('car_id', array('options' => $cars)); 

Alternativ können Sie so etwas wie tun:

echo $this->Form->input('Car.id', array('options' => $cars)); 
+0

Hey, du kannst 'Car' nicht direkt im' PassengersController' aufrufen. Sie müssten über Passenger darauf zugreifen. Außerdem wird das Optionsfeld für "car_id" automatisch als "$ cars" (falls verfügbar) betrachtet. :) – RabidFire

+0

1. Eigentlich können Sie. – Leo

+0

2. Ich bevorzuge Ausführlichkeit, da es die spätere Wartung erleichtert. – Leo

0
$this->CompanyCashback->bindModel(array('belongsTo' => array(
     'CompanyBranch' => array('className' => 'CompanyBranch', 'foreignKey' => false, 'conditions' => array('CompanyCashback.publisher_id = CompanyBranch.publisher_id && CompanyBranch.branch_type = "online" ')), 
     'PersonalInformation' => array('className' => 'PersonalInformation', 'foreignKey' => false, 'conditions' => array('CompanyCashback.publisher_id = PersonalInformation.user_id')), 
     'Country' => array('className' => 'Country', 'foreignKey' => false, 'conditions' => array('PersonalInformation.country_id = Country.id')), 
     'User' => array('className' => 'User', 'foreignKey' => false, 'conditions' => array('PersonalInformation.user_id = User.id'))) 
)); 
Verwandte Themen