Bonjour,
je possède deux table que je souhaiterai joindre.
La première est la table 'albums' composée de 4 champs(#id,name,description,cover) la seconde est la table 'medias' (#id,name,url,post_id,type,album_id).

Comment puis je faire pour que une requete dans le controller AlbumController, me récupère le media correspondant au cover de mon album?

J'ai essayé avec "hasAndBelongsToMany" et en précisant des conditions mais je dois mal m'y prendre.
Album.php

<?php
class Album extends AppModel{
    var $name="Album";
    var $hasAndBelongsToMany =array(
        "Media"=>array(
            'joinTable'=>'Album',
            'foreignKey'=>'coverage',
            'associationForeignKey'=>'id',
            'conditions'=>array(
                'Media.id'=>'Album.coverage',
                "Media.album_id"=>'Album.id')
            )
        );

Media.php

<?php
class Media extends AppModel{
    var $name="Media";
    var $hasAndBelongsToMany="Album";

Est ce que quelqu'un peu m'aider svp?

10 réponses


As-tu ta table de liaison ? (celle qui lie en BDD tes tables album & media)

duffJohn
Auteur

Non... comment dois je mettre ça en place?

Il faut que dans ta table Album, tu crées un champ media_id qui va te permettes de relier tes albums aux médias.
Ce champ est un entier : int, et pour ma part je l'ai ajouter à l'index...

duffJohn
Auteur

Enfait mon champs coverage reprend l'ID du média qui sera utilisé pour faire office de couverture. Est ce ce champ la dont tu parles?

je ne sais pas si tu as regardé le tuto sur les tags, mais Grafikart utilise $hasAndBelongsToMany pour relier la table tags et la table posts.
Il crée donc une table posts_tags avec les champs id, post_id et media_id. as tu quelques chose de ce genre ?
Sinon donne précisément tes tables.

duffJohn
Auteur

Non je n'ai pas de table correspondant a ce que tu dis.
Je vais regarder ça plus en détails alors :)

Perso j'ai créé une galerie d'image et dans mon model Galery j'ai fait un

public $actsAs = array(
        'Containable',
        'Media.Media' => array(
            'path' => 'galeries/%y/%m/%f'
        )
    );

et j'ai ajouté seulement dans ma table galeries, un champ media_id.
Avec le plugin média, ça se fait tout seul.

duffJohn
Auteur

Enfait je vais être plus précis.
J'ai un site avec une partie mes albums photo.

Dans cette page, il y a un petit texte expliquant qui est ce photographe, ainsi que plusieurs photos représentant chacune un album photo.
Dans le back office, en cliquant sur l'onglet de la page photo, je souhaiterai d'une part que la personne puisse administrer le petit texte de présentation, mais aussi voir la pochette de ses album déjà existant, et avoir la possibilité d'ajouter un nouvel album.

Le probleme est que j'ai un controleur Media, un controller Album, et un controleur Page.
Comment faire en sorte que dans un de ces controleurs je puisse récupérer toute les infos, c'est a dire le texte (contenu textuel de la page) qui devrai se trouver dans Page, le lien vers les album ainsi que la photo couverture de celui ci.

Y a t'il un tuto se rapprochant de cette action?
J'ai effectué le tuto sur création d'un site en plusieurs jours avec cakePhp...

Essaye d'utiliser la méthode containable. Ici le tuto.
Par exemple, j'utilise les catégories pour mes posts et mes albums. Ce sont les mêmes catégories, ex : j'ai un post catégorie Vélo et j'ai aussi des albums photos de cette même catégorie Vélo. Tout est lié.
Pour cela, dans mes models j'ajoute

public $actsAs = array('Containable');

ensuite dans mes controllers je mets par ex dans ma fonction index

$this->Galery->contain(,'Category');

Là, je mets mes catégories dans mes galeries, ainsi je peux faire un find().
Je ne sais pas si je suis clair...

duffJohn
Auteur

Merci,
je vais regarder ce tuto, et essayer de reproduire ton exemple.
Je te tiens au courant, encore merci.