Contexte

Je suis en train de développer un site porno, certe celà va faire rire certain mais mon problème est d'autant plus sérieux.

Je m'explique

J'essaye de faire une sauvegarde en BDD récursive avec des données brutes. J'ai une table temps de ce style :

CREATE TABLE `temps` (
    `embed` VARCHAR(500) NOT NULL,
    `thumb` VARCHAR(500) NOT NULL,
    `title` VARCHAR(500) NOT NULL,
    `tag` VARCHAR(500) NOT NULL,
    `category` VARCHAR(500) NOT NULL,
    `pornstar` VARCHAR(500) NOT NULL
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

j'essaye de trier ces données brutes dans 4 tables :

  • Videos (id, title, embed)
  • Categories (id, name)
  • Pornstars (id, name)
  • Thumbs (id, url)
  • Tags (id, name)

J'ai aussi créer les tables assocciatives

  • Categories_Videos (id, id_category, id_video)
  • Thumbs_Videos (id, id_thumb, id_video)
  • Pornstars_Videos (id, id_pornstar, id_video)
  • Tags_Videos (id, id_tag, id_video)
Le code

Pour effectuer le traitement j'ai créé un controller TempsController

<?php
App::uses('AppController', 'Controller');
/**
 * Temps Controller
 *
 * @property Temp $Temp
 * @property PaginatorComponent $Paginator
 */
class TempsController extends AppController {
    public function transfert()
    {
        $this->autoRender = false;

        $this->loadModel('Video');
        $this->loadModel('Pornstar');
        $this->loadModel('Category');
        $this->loadModel('Thumb');

        $temp = $this->Temp->Find('all');

        $Categories = array();
        $Pornstars = array();
        $Thumbs = array();
        $Video = array();

        foreach ($temp as $t) {
            $catVrac = $t['Temp']['category'];
            $catVrac = str_replace("\"", "", $catVrac);
            $Categories = explode(",", $catVrac);

            $pornstarVrac = $t['Temp']['pornstar'];
            $pornstarVrac = str_replace("\"", "", $pornstarVrac);
            $Pornstars  = explode(",", $pornstarVrac);

            $thumbVrac = $t['Temp']['thumb'];
            $thumbVrac = str_replace("\"", "", $thumbVrac);
            $Thumbs  = explode(",", $thumbVrac);

            $Video = array(array(
                'Video' => array(
                    'title' => str_replace("\"", "", $t['Temp']['title']),
                    'embed' => str_replace("\"", "", $t['Temp']['embed'])
                    ),
                'Category' => $Categories,
                'Pornstar' => $Pornstars,
                'Tag' => null,
                'Thumb' => $Thumbs
            ));
            // debug($Video);
            // die();

            debug($this->Video->saveAll($Video));
        }
    }

    public function beforeFilter() {
        parent::beforeFilter();

        // Pour CakePHP 2.0
        // $this->Auth->allow('*');

        // Pour CakePHP 2.1 et supérieurs
        // $this->Auth->allow();
        $this->Auth->allow('transfert');
    }
}

J'ai baké les table Videos, Thumbs, Tags, Pornstars, Categories.

<?php
App::uses('AppModel', 'Model');
/**
 * Video Model
 *
 * @property Category $Category
 * @property Pornstar $Pornstar
 * @property Tag $Tag
 * @property Thumb $Thumb
 */
class Video extends AppModel {

/**
 * Validation rules
 *
 * @var array
 */
    public $validate = array(
        'title' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                //'message' => 'Your custom message here',
                //'allowEmpty' => false,
                //'required' => false,
                //'last' => false, // Stop validation after this rule
                //'on' => 'create', // Limit validation to 'create' or 'update' operations
            ),
        ),
        'embed' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                //'message' => 'Your custom message here',
                //'allowEmpty' => false,
                //'required' => false,
                //'last' => false, // Stop validation after this rule
                //'on' => 'create', // Limit validation to 'create' or 'update' operations
            ),
        ),
    );

    //The Associations below have been created with all possible keys, those that are not needed can be removed

/**
 * hasAndBelongsToMany associations
 *
 * @var array
 */
    public $hasAndBelongsToMany = array(
        'Category' => array(
            'className' => 'Category',
            'joinTable' => 'categories_videos',
            'foreignKey' => 'video_id',
            'associationForeignKey' => 'category_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
        ),
        'Pornstar' => array(
            'className' => 'Pornstar',
            'joinTable' => 'pornstars_videos',
            'foreignKey' => 'video_id',
            'associationForeignKey' => 'pornstar_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
        ),
        'Tag' => array(
            'className' => 'Tag',
            'joinTable' => 'tags_videos',
            'foreignKey' => 'video_id',
            'associationForeignKey' => 'tag_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
        ),
        'Thumb' => array(
            'className' => 'Thumb',
            'joinTable' => 'thumbs_videos',
            'foreignKey' => 'video_id',
            'associationForeignKey' => 'thumb_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
        )
    );

}
Le Problème

Quand j'execute mon traitement, je me retrouve avec des donnée dans la table Videos et dans la table associative Pornstars_Videos, SAUF que mes pornstar_id sont à 0 et que mes autres tables sont vide.

Ai-je fait une erreur dans mon traitement, et si oui pourriez vous m'aider pour le résoudre. J'ai écumé les sites (StackOv, cookbook, ect.. ) ET je n'arrive pas à comprendre POURQUOI celà ne marche pas..

je vous remercie tous pour votre attention.

2 réponses


Oui j'ai essayé.. en vain
j'ai surchargé le saveAssociated appModel comme sur les tutos :

public function saveAssociated($data = null, $options = array()) {
        foreach ($data as $alias => $modelData) {
            if (!empty($this->hasAndBelongsToMany[$alias])) {
                $habtm = array();
                $Model = ClassRegistry::init($this->hasAndBelongsToMany[$alias]['className']);
                foreach ($modelData as $modelDatum) {
                    if (empty($modelDatum['id'])) {
                        $Model->create();
                    }
                    $Model->save($modelDatum);
                    $habtm[] = empty($modelDatum['id']) ? $Model->getInsertID() : $modelDatum['id'];                    
                }
                $data[$alias] = array($alias => $habtm);
            }
        }
        return parent::saveAssociated($data, $options);
    }

mais rien y fait...