I have a site developed in cakephp 2.0, I want to make a relation between two tables:
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
actions
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 want to associate the two tables with the field "type_id". I have done in this mode into my code:
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'
)
);
}
It doesn't retrieve the correct data.. It seems that It takes the id for the foreign key. This is the view:
<?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
}
?>
The controller is a simple query with find all and recursive 3 into the User that is collegate with the tables
$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
The first thing if you are using an "id" field in your "activity_ingredients" table, then you should use it as a foreignKey in another table.
A foreign key is a field in a relational table that matches a candidate key of another table.
Even if you are trying to use type_id as foreign key in "actions" table, Then type_id must be unique in your activity_ingredients table, and if it is so then you can define your ActivityIngredient Model as:
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'
)
);
}
And your Action Model will remain the same. And hence you will be able to fetch the desired records.
And even if you are not agree to define "type_id" as foreign key in your table. Then this code will work extremely well with your situation.
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__$} '
)
);
}
I am sure this will give you the desired result. Kindly ask if it not worked for you.