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 !

2 réponses


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.

cuisse
Auteur

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