Bonsoir,

Suite à une jointure belongsTo, hasMany plus rien ne fonctionne

Dans mon controller SeriesController je veux accéder à $this->Serie->find('all') via l'adresse admin/series/index et il me dit :

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Episode.series_id' in 'field list'

En effet series_id n'existe pas vu qu'il faut du singulier au niveau de la convention.

Dans Serie.php j'ai :

public $hasMany = array('Episode');

et dans Episode.php j'ai :

public $belongsTo = array('Serie');

Donc une série à plusieurs épisode et un épisode appartient à une série.

Voici SeriesController.php :

<?php
class SeriesController extends AppController {
    public $uses = array('Serie');
    public function admin_menu() {
        return $this->Serie->find('all');
    }
    public function index(){
        $d'series'] = $this->Serie->find('all');
        $this->set($d);
    }
    function show($id = null,$slug = null){
        if(!$id)
            throw new NotFoundException('Aucune page ne correspond à cet ID'); 
        $page = $this->Serie->find('first', array(
            'conditions' => array('id' => $id)
        ));
        if(empty($page))
            throw new NotFoundException('Aucune page ne correspond à cet ID'); 
        if($slug != $page'Serie']'slug'])
            $this->redirect($page'Serie']'link'],301);
        $d'serie'] = current($page);
        $this->set($d);
    }
    public function admin_index(){
        $d'series'] = $this->Serie->find('all');
        $this->set($d);
    }
}
?>

Pour ne pas avoir d'erreur je dois faire $this->Serie->Episode mais je ne veux pas forcément récupérer des information sur la table episodes. Par la même occasion admin_menu() ne fonctionne pas non plus pour l'utilisation d'un requestAction dans une vue

Si ça peut aider voila mon EpisodesController.php

<?php
class EpisodesController extends AppController {

    public function admin_index() {
        $this->loadModel('Serie');
        $d'series'] = $this->Serie->Episode->find('all');
        $this->set($d);
    }
    public function admin_edit($id = null) {
        if($this->request->is('post') || $this->request->is('put')) {
            if($this->Episode->save($this->request->data)) {
                $this->Session->setFlash("L'épisode à bien été ajouté","notif");
                $this->redirect(array('action'=>'index'));
            }
        }
        elseif($id) {
            $this->Episode->id = $id;
            $this->request->data = $this->Episode->read();
        }
        $d'series'] = $this->Episode->Serie->find('list');
        $this->set($d);
    }
    public function admin_delete($id) {
        $this->Session->setFlash("L'épisode a bien été supprimé",'notif'); 
        $this->Post->delete($id); 
        $this->redirect($this->referer());
    }
}
?>

Merci d'avance.

2 réponses


Force la clef avec 'foreignKey' => 'serie_id' pour éviter ton problème.

Flowcki
Auteur

Merci de ta réponse mais ça ne change absolument rien, je crois que le problème vient d'ailleurs, j'ai réussi à le faire fonctionner tout à l'heure sans forcer la clé étrangère mais ce n'était pas ce que je voulais et j'ai modifié ensuite (voir plus haut).

public $belongsTo = array(
        'Serie' => array(
            'foreignKey' => 'serie_id'
        )
    );

Ça ne fonctionne donc pas :/

Le résultat de ma requête sur SeriesController::admin_index :

SELECT `Episode`.`id`, `Episode`.`saison`, `Episode`.`episode`, `Episode`.`name`, `Episode`.`diffusion`, `Episode`.`info`, `Episode`.`serie_id`, `Episode`.`series_id` FROM `episodes` AS `Episode` WHERE `Episode`.`series_id` = (1)

Pourtant le admin_index est des plus classique, donc le soucis doit venir de la jointure mais je ne trouve pas.