2012-07-19 5 views
5

Ho un sito sviluppato in CakePHP 2.0, voglio fare una relazione tra due tabelle:chiave esterna cakephp non la chiave 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   

azioni

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 vuoi associare le due tabelle con il campo "id_tipo". ho fatto in questo modo nel mio codice:

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' 
      ) 
     ); 
    } 

E non recupera i dati corretti .. Sembra che ci vuole l'ID per la chiave esterna. Questa è 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 
} 
?> 

Il controller è una semplice query con trovare tutte e ricorsivo 3 nella utente che è collegate con i tavoli

$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); 

help me please

risposta

2

La prima cosa se si utilizza un campo "id" nella tabella "activity_ingredients", allora si dovrebbe usarlo come ForeignKey in un'altra tabella.

Una chiave esterna è un campo in una tabella relazionale che corrisponde a una chiave candidata di un'altra tabella.

Anche se si sta tentando di utilizzare type_id come chiave esterna nella tabella "azioni", quindi type_id deve essere univoco nella tabella activity_ingredients, e se è così allora è possibile definire le ActivityIngredient Modello come:

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' 
     ) 
    ); 
} 

E il tuo modello di azione rimarrà lo stesso. E quindi sarai in grado di recuperare i record desiderati.

E anche se non si è d'accordo nel definire "type_id" come chiave esterna nella tabella. Quindi questo codice funzionerà molto bene con la tua situazione.

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__$} ' 
    ) 
); 

}

Sono sicuro che questo vi darà il risultato desiderato. Si prega di chiedere se non ha funzionato per voi.

-1

In cakephp puoi assegnare lo primary key of a model. Credo che puoi anche inserire il nome della classe nell'associazione di chiavi esterne. Per esempio

'foreignKey' => 'Classname.type_id'