2009-11-07 4 views
0

Je suis un utilisateur débutant, mais je connais bien le php et le frame en général (j'avais l'habitude d'utiliser Code Igniter). Comment puis-je appeler le modèle ci-dessous et ne renvoyer que les enregistrements Artist et les enregistrements ArtistImage associés, et non les enregistrements de l'album.Spécifier les relations de modèle à charger

class Artist extends AppModel { 

    var $name = 'Artist'; 
    var $hasMany = array('Album', 'ArtistImage'); 

} 

De même, pouvez-vous clarifier les valeurs de $ this-Artist-> recursive?

Merci pour l'aide

Répondre

2

Je pense que le problème est votre modèle d'artiste. La bonne façon d'ajouter le comportement est

<?php 
    Class Artist extends AppModel 
    { 
     public $name = "Artist"; 
     public $actsAs = array('Containable'); 
    } 
?> 

avis la variable actsAs est plurielle, votre modèle a comme $ actAs = array (..) avec la variable comme singulier.

+0

OUI! C'était ça. Merci encore pour votre aide. Supervision totale en mon nom. –

1

Le comportement maîtrisable (book.cakephp.org/view/474/Containable) est ce que vous cherchez.

La propriété récursive (book.cakephp.org/view/439/recursive) indique à quel point CakePHP doit aller dans le sens des relations lors de la récupération des enregistrements.

+0

des difficultés à faire que cela fonctionne, j'ai posté une description fo l'erreur que je reçois ci-dessous: –

3
// Artist /app/models/artist.php 
    class Artist extends AppModel { 

     var $name  = 'Artist'; 
     var $hasMany = array('Album', 'ArtistImage'); 
     var $actAs  = array('Containable'); 
    } 


    // ArtistsController /app/controllers/artists_controller.php 
    class ArtistsController extends AppController { 

     var $name  = 'Artists'; 

     public function example() { 

      debug($this->Artist->find('all'); 

      debug($this->Artist->find('all', array(
       'recursive' => 0, 
      )); 

      debug($this->Artist->find('all', array(
       'contain' => array(
        'ArtistImage' => array(
         // artist find options here i.e. fields, conditions, order etc 
       ), 
       ); 
      )); 
     } 
    } 

    // results 
    // with just find('all') 
    Array 
    (
     [0] => Array 
      (
       [Artist] => Array 
        (
         [id] => 1, 
         [name] => Wumpscut 
        ), 
       [Album] => Array 
        (
         [0] => Array 
          (
           [id] => 1, 
           [artist_id] => 1, 
           [name] => Bunker Gate Seven 
          ), 
         [1] => Array 
          (
           [id] => 2, 
           [artist_id] => 1, 
           [name] => Born Again 
          ) 
        ), 
       [ArtistImage] => Array 
        (
         [0] => Array 
          (
           [id] => 1, 
           [artist_id] => 1, 
           [file] => Bunker-Gate-Seven-Cover.jpg 
          ), 
         [1] => Array 
          (
           [id] => 2, 
           [artist_id] => 1, 
           [file] => Born-Again-Cover.jpg 
          ) 
        ) 
      ), 
     [1] => Array 
      (
       [Artist] => Array 
        (
         [id] => 2, 
         [name] => Oneriod Psychosis 
        ), 
       [Album] => Array 
        (
         [0] => Array 
          (
           [id] => 3, 
           [artist_id] => 2, 
           [name] => Fantasies About Illness 
          ), 
        ), 
       [ArtistImage] => Array 
        (
         [0] => Array 
          (
           [id] => 3, 
           [artist_id] => 2, 
           [file] => Fantasies-About-Illness-Cover.jpg 
          ), 
        ) 
      ) 
    ) 


    // results 
    // with recursive 0 
    Array 
    (
     [0] => Array 
      (
       [Artist] => Array 
        (
         [id] => 1, 
         [name] => Wumpscut 
        ), 

      ), 
     [1] => Array 
      (
       [Artist] => Array 
        (
         [id] => 2, 
         [name] => Oneriod Psychosis 
        ) 
      ) 
    ) 


    // results 
    // with find('all', array('contain' => array('ArtistImage')) 

    Array 
    (
     [0] => Array 
      (
       [Artist] => Array 
        (
         [id] => 1, 
         [name] => Wumpscut 
        ), 
       [ArtistImage] => Array 
        (
         [0] => Array 
          (
           [id] => 1, 
           [artist_id] => 1, 
           [file] => Bunker-Gate-Seven-Cover.jpg 
          ), 
         [1] => Array 
          (
           [id] => 2, 
           [artist_id] => 1, 
           [file] => Born-Again-Cover.jpg 
          ) 
        ) 
      ), 
     [1] => Array 
      (
       [Artist] => Array 
        (
         [id] => 2, 
         [name] => Oneriod Psychosis 
        ), 
       [ArtistImage] => Array 
        (
         [0] => Array 
          (
           [id] => 3, 
           [artist_id] => 2, 
           [file] => Fantasies-About-Illness-Cover.jpg 
          ), 
        ) 
      ) 
    ) 

Espoir qui aide à expliquer

+0

difficultés à obtenir les cela fonctionne, j'ai posté une description fo l'erreur que je reçois ci-dessous: –

0

Pouvez-vous poster votre contrôleur et le modèle en pastebin? Postez ces liens ici lorsque vous avez terminé.

Dans votre entrée pastebin vous utilisez ...

if($images) { 
    echo("Loading Artist Images"); 
    $this->Artists->recursive = 1; 
    $this->Artists->contains('ArtistImage'); 
} else { ... 

Cette habitude de travail pour quelques raisons. Tout d'abord, les noms de modèles doivent être singuliers. C'EST À DIRE. Artists = Artist Deuxième - le comportement Containable n'a pas de fonction "contient", le nom de la fonction correcte est aussi singulier. I.E contient ('ArtistImage') = contient ('ArtistImage')

Donc, je FTFY, ici vous allez.

if($images) { 
    echo("Loading Artist Images"); 
    $this->Artist->contain('ArtistImage'); 
} else { ... 

Espérons que cela clarifie les choses pour vous. http://book.cakephp.org/view/474/Containable http://book.cakephp.org/view/22/CakePHP-Conventions

En outre, selon la version de gâteau que vous utilisez, je crois appeler une fonction de modèle qui n'existe pas (c.-à-Model-> contient (...)) va essayer et d'appeler une procédure stockée à partir mysql si le fichier Model n'a pas de fonction de ce nom.

+0

BTW Voici l'erreur: // Erreur Avertissement (512): Erreur SQL: 1064: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'contain' à la ligne 1 [CORE/cake/libs/model/datasources/dbo_source.php, ligne 514] // Dans la liste des requêtes exécuté il répertorie: 2 contient 1064: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'contain' à la ligne 1 –

+0

la ligne $ this-> Artist-> recursive = 1; N'est pas nécessaire, le comportement Containable va trier cela pour vous. Je n'ai pas de dev ici pour jouer, mais je pense que c'est peut-être ce qui vous pousse à aller chercher plus d'informations que ce que vous demandez. –

+0

faites-moi une faveur, faire un spectacle mysql créer sur les tables concernées, poste une table par pastebin avec un pastebin pour chaque modèle et le contrôleur. Je vais recréer la structure ici et jeter un oeil. –

-1

Le modèle est l'album, il devrait donc être $ this-> album au lieu de $ this-> Albums

App :: import ('modèle', 'Album');

$ this-> Album-> contient ('Song'); $ items = $ this-> Album-> findAllByArtistId ($ artist_id);

+0

J'ai essayé ce changement et il donne toujours l'erreur. $ this-> Artist-> contient ('ArtistImage'); Cependant, il renvoie les éléments connexes, mais tous, pas ceux que j'ai choisis comme contenant. Aussi s'il vous plaît se référer à mon exemple de code pastebin dans le commentaire ci-dessous, c'est le plus récent. –

+0

essayez $ this-> Artist-> contain ('ArtistImage') avec aucun s au contenu. Vous utilisez s dans les conditions. –

Questions connexes