2010-12-23 3 views
5

Je souhaite modéliser la relation simple suivante:Cakephp: BelongsTo Relation

Un passager appartient à une voiture de tourisme; Une voiture a beaucoup de passagers.

La table des passagers a une colonne id et Car_id, la table Car a une seule colonne id.

Mes modèles ressemblent à ceci:

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

et

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

et mon passager Ajouter .ctp ressemble à ceci:

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

mais quand j'accéder à la page pour ajouter un passager, tout ce que je vois est une boîte vide. Y a-t-il une étape supplémentaire que je dois prendre pour remplir la boîte de dépôt avec toutes les voitures?

+0

bonne +1 pour gâteau php question nouvelle à gâteau php – XMen

Répondre

2

Tout d'abord, vous avez oublié de mentionner la belongsTo relation dans votre modèle de passagers:

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

Ensuite, dans l'action correspondante de votre contrôleur , vous devrez obtenir un list de toutes les voitures à partir de la base de données et définissez-le au pluriel de la variable du modèle ($ cars). Vous faire comme ceci:

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

Cela va convertir le champ d'entrée car_id dans une liste déroulante avec les informations de population.

HTH.

+0

+1 alors que je sais déjà, c'est une bonne explication. –

+0

hey dans ce cas, je dois inclure le modèle «Car» dans le contrôleur? –

2

Le passager ne saura que la voiture à laquelle il est associé - à ce stade, aucun.

Dans la méthode d'ajout dans le contrôleur de passagers, faire

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

et passer le résultat dans votre point de vue:

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

Dans la vue, donner la variable voitures $ la valeur pour les options $ dans la déclaration de zone:

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

Sinon, vous pouvez faire quelque chose comme:

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

Hey, vous ne pouvez pas accéder 'Car' directement dans' PassengersController'. Vous devriez y accéder via Passenger. En outre, le champ d'options de 'car_id' est automagiquement considéré comme' $ cars' (si disponible). :) – RabidFire

+0

1. En fait, vous pouvez. – Leo

+0

2. Je préfère la verbosité car elle rend la maintenance plus facile. – 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'))) 
));