Bonjour à tous,

quand je veux mettre a jour une base de donnée selon un ID, j'ai appris à faire ainsi:

$this->User->id = $user_id; // pour sélectionner la ligne

Cette fois-ci je veux sélectionner la lifne en fonction du champs 'noarticle',

Avant de continuer, j'aimerais plus détailler ce que je veux faire.

J'ai deux table 'article' et 'articlestoupdate'
la table 'articlestoupdate' contient les informations qui doivent etre mis à jour.
La tabe 'article' est la table qui va etre mise a jour, en fonction de l'autre.

J'ai donc créer cette fonction qui va 'lire' dans articlestoupdate et mettre a jour 'article'.
je suis dans le controller ArticlesController.

function admin_updatearticles(){
        $this->loadModel('Articlestoupdate');
        $articlestoupdates = $this->Articlestoupdate->find('all');
        foreach($articlestoupdates as $k => $v){

                        // Ceci est temporaire, ca me sert juste de tester une ligne sur les 3870.
            if($v'Articlestoupdate']'noarticle'] == '01013'){

                        // Ici je peux sélectionner la ligne à mettre a jour.
            $this->Article->noarticle = $v'Articlestoupdate']'noarticle'];
            $this->Article->saveField('shop_1',1);
            $this->Article->saveField('category_id',$v'Articlestoupdate']'category_id']);
            $this->Article->saveField('untergruppe',$v'Articlestoupdate']'untergruppe']);
            $this->Article->saveField('name',$v'Articlestoupdate']'name']);
            }
        }
        $d'articlestoupdate']'Articlestoupdate']'name'] = 'ee';
        $this->set($d);
    }

J'aimerais savoir si ceci est juste pour sélectionner la ligne dont le champs 'noarticle' est egal a 01013

$this->Article->noarticle = $v'Articlestoupdate']'noarticle'];

Parce que ca ne marche pouas.

3 réponses


Non ça ne fonctionnera pas ! En revanche tu peux utiliser la fonction updateAll http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions

Bonjour.
Non, le 'id' après un nom de modèle, c'est une méthode spécifique, tu ne peux pas mettre juste le nom d'un champ juste après le nom du modèle.
Si ça marche pour id, c'est parce qu'ils partent du principe que le champ id dans une table d'une base de données est en général la clé primaire de la table.
Il faut que tu fasses quelque chose du genre :

public function admin_updatearticles($number){
    $this->loadModel('Articlestoupdate');
    $datas = $this->Articlestoupdate->find('all', array(
                                           'fields' => array('category_id', 'untergruppe', 'name'), 
                                           'conditions' => array('noarticle' => $number)));
    $update = array(
                    'shop_1' => 1, 
                    'category_id' => $datas'Articlestoupdate']'category_id'], 
                    'untergruppe' => $datas'Articlestoupdate']'untergruppe'], 
                    'name' => $datas'Articlestoupdate']'name'], array('noarticle' => $number));
    if($this->Article->updateAll($update)){
        /* Intéraction ou message pour réussite */
    } else {
        /* Intéraction ou message pour échec */
    }
}

Je ne comprends quand même pas pourquoi tu fais avec deux tables pour les mêmes données, ça te fait faire une double manipulation pour toi et pour ton serveur.

Salut Lkatak

Je ne comprends quand même pas pourquoi tu fais avec deux tables pour les mêmes données, ça te fait faire une double manipulation pour toi et pour ton serveur.

Oui, je comprends, mais cette opération ne se fera qu'une fois par année. Si j'ai choisi cette méthode c'est parce que dans la table Articles, je souhaite que noarticle reste "associé" au meme id, donc la colonne id.
Donc j'ai préféré parcourir, la table articlestoupdate et mettre à jour les meme champs de la tablée Article.
Aussi, au cours de l'année, on peut ajouter de nouveau article, et je ne veux pas que ces dernier soit altéré.

J'ai 3870 article, donc je ne peux pas faire ceci /admin/articles/articlestoupdate/01013, 3870 fois. Je préfère revnir sur ca

$articlestoupdates = $this->Articlestoupdate->find('all');

Aussi parce que je vais utiliser toutes les champs. Vois-tu?
Donc pas besoin de les sélectionner.

Pa contre la suite m'intéresse:

$datas = $this->Articlestoupdate->find('all');
foreach($datas as $k => $v){
$update = array(
                    'shop_1' => 1,
                    'category_id' => $v'Articlestoupdate']'category_id'],
                    'untergruppe' => $v'Articlestoupdate']'untergruppe'],
                    'name' => $v'Articlestoupdate']'name'], 
                    // Ici on sélection la ligne?
                    array('noarticle' => $v'Articlestoupdate']'noarticle']));
// Juste pour tester un enregistrement. Cette condition sera commentée en prod.
if($v'Articlestoupdate']'noarticle']=='01013'){
    if($this->Article->updateAll($update)){
        /* Intéraction ou message pour réussite */
    } else {
        /* Intéraction ou message pour échec */
    }
}
}

Ca peut jouer ca, non?