Bonsoir,
Lors d'un simple update pour mettre à jour l'id du dernier post dans le topic avec un saveField, je m'aperçois que le behavior Containable me fait des left join complètement inutiles dans ce cas là. Y a t il un moyen de l'éviter ? Bien évidemment ce n'est pas gênant, mais ça n'a aucun sens.
UPDATE `forum_topics` AS `Topic`
LEFT JOIN `forum_categories` AS `Category` ON (`Topic`.`category_id` = `Category`.`id`)
LEFT JOIN `users` AS `User` ON (`Topic`.`user_id` = `User`.`id`)
LEFT JOIN `forum_posts` AS `LastPost` ON (`Topic`.`lastpost_id` = `LastPost`.`id`)
SET `Topic`.`post_count` = 23
WHERE `Topic`.`id` = 1
Merci et bon week-end !
Bonsoir.
Ce serait bien d'afficher le code de ta fonction dans laquelle il il y a ton saveField, ce sera plus parlant et l'on pourra te répondre plus efficacement.
Et puis, si l'update nécessite de faire des jointures, c'est tout à fait normal que le behaviour Containable soit utilisé dans la requête.
Bonsoir Lartak,
Merci pour la réponse. J'ai compris de quoi ça venait, j'ai 2 counterCache pour compter les topics et les posts, dès que je les enlève ma requête perd les jointures inutiles et je me retrouve avec 5 requêtes au lieu de 18 pour le simple fait d'ajouter un post. CakePhp a un ORM assez gourmand ?
Voici la fonction qui consiste à ajouter un post dans le controller qui gère les posts :
public function add($id = null)
{
if (!$id)
{
throw new NotFoundException('Invalid topic');
}
$topic = $this->Post->Topic->find('first', array(
'contain' => array(
'Category' => array(
'fields' => array('id', 'name')
)
),
'fields' => array('Topic.id', 'Topic.name'),
'conditions' => array('Topic.id' => $id)
));
if (!$topic)
{
throw new NotFoundException('Invalid topic');
}
if ($this->request->is('post'))
{
$this->request->data'Post']'category_id'] = $topic'Category']'id'];
$this->request->data'Post']'topic_id'] = $topic'Topic']'id'];
$this->request->data'Post']'user_id'] = $this->Auth->user('id');
$this->Post->create();
if ($this->Post->save($this->request->data, true, array('category_id', 'topic_id', 'content', 'user_id')))
{
// Mise à jour du dernier post
$this->Post->Topic->id = $id;
$this->Post->Topic->saveField('lastpost_id', $this->Post->id);
$this->Post->Topic->saveField('lastuser_id', $this->Auth->user('id'));
$this->Session->setFlash('La réponse a été postée avec succès.', 'default', array('class' => 'alert alert-success'));
return $this->redirect(array('controller' => 'topics', 'action' => 'view', $topic'Topic']'id']));
}
$this->Session->setFlash('Veuillez corriger les erreurs.', 'default', array('class' => 'alert alert-error'));
}
$this->set(compact('topic'));
}