2010-12-23 15 views
5

Quiero modelar la siguiente relación simple:Cakephp: Pertenece a la relación

One Passenger pertenece a un automóvil; Un auto tiene muchos pasajeros.

La mesa de pasajeros tiene una identificación y una columna Car_id, la mesa del automóvil tiene una columna de identificación.

Mis modelos se parecen a esto:

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

y

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

y mi complemento de pasajeros .ctp se ve así:

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

pero cuando accedo a la página para agregar un pasajero, todo lo que veo es un cuadro desplegable vacío. ¿Hay algún paso adicional que deba seguir para completar el dropbox con todos los automóviles?

+0

+1 para la torta php buena pregunta para nuevo en PHP torta – XMen

Respuesta

2

En primer lugar, se han olvidado de mencionar la relación belongsTo en su modelo de pasajeros:

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

A continuación, en la acción correspondiente de su controlador, tendrá que obtener una list de todos los coches de la base de datos, y establecerlo en la forma plural de la variable del modelo ($ autos). Se podría hacer eso, así:

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

Esto convertirá el campo car_id de entrada en una lista desplegable con la información poblada.

HTH.

+0

1 aunque sé que esto ya, que es una buena explicación. –

+0

hey, en este caso, necesito incluir el modelo 'Car' en el controlador? –

2

El pasajero solo sabrá sobre el automóvil con el que está asociado, en este momento, ninguno.

En el método add en el controlador del pasajero, no

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

y pasar el resultado a la vista:

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

En el juicio, puedan dar los $ coches variables como el valor para $ opciones en la declaración de campo:

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

Alternativamente, se puede hacer algo como:

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

Oye, no puedes acceder a 'Car' directamente en el' PassengersController'. Tendría que acceder a través de Passenger. Además, el campo de opciones para 'car_id' se toma automágicamente como' $ cars' (si está disponible). :) – RabidFire

+0

1. En realidad, puedes. – Leo

+0

2. Prefiero verbosidad ya que facilita el mantenimiento posterior. – 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'))) 
)); 
Cuestiones relacionadas