2012-07-19 21 views
5

que tiene un sitio desarrollado en CakePHP 2.0, quiero hacer una relación entre dos tablas:clave externa cakephp no la clave primaria

activity_ingredients

1 id int(10) UNSIGNED No None AUTO_INCREMENT 
2 type_id  tinyint(2) No None   
3 activity_id  int(11)  No None   
4 ingredient_id int(10)  No None   
5 created  datetime   

acciones

1 id int(10) UNSIGNED No None AUTO_INCREMENT 
2 type_id  tinyint(2) No None   
3 language char(2)  No None   
4 text varchar(100)  No None   
5 created  datetime  

I desea asociar las dos tablas con el campo "type_id". que he hecho en este modo en mi código:

class Action extends AppModel{ 
    public $name = 'Action'; //non utilizzata nel sito è il nome del modello alla fine per migliorare la compatibilità 

    public $belongsTo = array(
     'ActivityIngredients' => array(
      'className'  => 'ActivityIngredients', 
      'conditions' => '', 
      'order'   => '', 
      'foreignKey' => 'type_id' 
     ) 
    ); 

}

class ActivityIngredients extends AppModel{ 
     public $name = 'ActivityIngredients'; //non utilizzata nel sito è il nome del modello alla fine per migliorare la compatibilità 

     public $belongsTo = array(
      'Activity' => array(
       'className'  => 'Activity', 
       'conditions' => '', 
       'order'   => '', 
       'foreignKey' => 'activity_id' 
      ), 
      'Ingredient' => array(
       'className'  => 'Ingredient', 
       'conditions' => '', 
       'order'   => '', 
       'foreignKey' => 'ingredient_id' 
      ) 
     ); 

     public $hasMany = array(
      'Action' => array(
       'className' => 'Action', 
       'conditions' => '', 
       'dependent' => true, 
       'foreignKey' => 'type_id', 
       'associatedKey' => 'type_id' 
      ) 
     ); 
    } 

no recupera los datos correctos .. Parece que se necesita el identificador de la clave externa. Esta es la vista:

<?php foreach ($user['Activity'] as $activities) { 
var_dump($activities); 
?> 
    <div class="line-cnt"><div class="line"> 
    </div> 
</div> 
<h2>Attività</h2> 
<div class="table"> 
    <div> 
     <div>Activity created</div><div><?php echo $activities['created']; ?> 
     </div> 
    </div> 
    <div> 
     <div>Actions text</div><div><?php echo $activities['Action']['text']; ?></div> 
    </div> 
    <div> 
     <div>ActivityIngredient ingredient_id</div><div><?php echo $activities['ActivityIngredients']['ingredient_id']; ?></div> 
    </div> 
</div> 
<?php 
} 
?> 

El controlador es una simple consulta con encontrar todos y recursivo 3 en el usuario que es collegate con las tablas

$this->User->recursive = 3; 
     $user = $this->User->read(); 

     if (empty($username) || $username != $user['User']['username']) { 
      $this->redirect(array ('action'=>'view',$id,$user['User']['username'])); 
     } 

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

me ayude por favor

Respuesta

2

Lo primero si está utilizando un campo "id" en la tabla "activity_ingredients", entonces se debe utilizar como un foreignKey en otra tabla.

Una clave externa es un campo en una tabla relacional que coincide con una clave candidata de otra tabla.

Incluso si usted está tratando de utilizar TYPE_ID como clave externa en la tabla "acciones", entonces TYPE_ID debe ser único en su mesa activity_ingredients, y si es así entonces usted puede definir su modelo ActivityIngredient como:

class ActivityIngredients extends AppModel{ 
    public $primaryKey = 'type_id'; 
    public $name = 'ActivityIngredients'; //non utilizzata nel sito è il nome del modello alla fine per migliorare la compatibilità 

    public $belongsTo = array(
     'Activity' => array(
      'className'  => 'Activity', 
      'conditions' => '', 
      'order'   => '', 
      'foreignKey' => 'activity_id' 
     ), 
     'Ingredient' => array(
      'className'  => 'Ingredient', 
      'conditions' => '', 
      'order'   => '', 
      'foreignKey' => 'ingredient_id' 
     ) 
    ); 

    public $hasMany = array(
     'Action' => array(
      'className' => 'Action', 
      'conditions' => '', 
      'dependent' => true, 
      'foreignKey' => 'type_id', 
      'associatedKey' => 'type_id' 
     ) 
    ); 
} 

Y su modelo de acción seguirá siendo el mismo. Y, por lo tanto, podrá obtener los registros deseados.

E incluso si no está de acuerdo con definir "type_id" como clave foránea en su tabla. Entonces este código funcionará extremadamente bien con su situación.

class ActivityIngredients extends AppModel{ 
public $name = 'ActivityIngredients'; //non utilizzata nel sito è il nome del modello alla fine per migliorare la compatibilità 

public $belongsTo = array(
    'Activity' => array(
     'className'  => 'Activity', 
     'conditions' => '', 
     'order'   => '', 
     'foreignKey' => 'activity_id' 
    ), 
    'Ingredient' => array(
     'className'  => 'Ingredient', 
     'conditions' => '', 
     'order'   => '', 
     'foreignKey' => 'ingredient_id' 
    ) 
); 

public $hasMany = array(
    'Action' => array(
     'className' => 'Action', 
     'conditions' => '', 
     'dependent' => true, 
     'foreignKey' => false, 
     'finderQuery' => 'select * from actions as `Action` where 
          `Action`.`type_id` = {$__cakeID__$} ' 
    ) 
); 

}

Estoy seguro de que esto le dará el resultado deseado. Por favor pregunte si no funcionó para usted.

-1

en CakePHP puede asignar el primary key of a model. Creo que también puede poner el nombre de clase en la asociación de clave externa. Por ejemplo

'foreignKey' => 'Classname.type_id' 
Cuestiones relacionadas