2009-11-07 112 views
0

我是一个初级的Cake用户,但熟悉php和框架的工作原理(我曾经使用Code Igniter)。如何在下面调用模型并仅返回艺术家记录和相关艺术家图像记录,而不是相册记录。指定加载哪种模型关系

class Artist extends AppModel { 

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

} 

另外,你能澄清$ this-Artist-> recursive的值吗?

感谢您的帮助

回答

2

我认为这个问题是你的艺术家模型。添加行为的正确方法是

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

通知的actsAs变量是复数,你的模式有它作为$ ACTAS =阵列(..)与变量作为一个单数。

+0

是的!就是这样。再次感谢你的帮助。代表我进行全面监督。 – 2009-11-18 01:51:12

1

的中容纳的行为(book.cakephp.org/view/474/Containable)是你在找什么。

递归属性(book.cakephp.org/view/439/recursive)告诉CakePHP在获取记录时应该如何深入关系。

+0

得到这个工作有问题,我贴FO错误的描述我正在下面: – 2009-11-08 20:35:50

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 
          ), 
        ) 
      ) 
    ) 

希望帮助解释它

+0

有问题得到这个工作,我贴FO错误的描述我正在下面: – 2009-11-08 20:35:20

0

您可以发布您的控制器和模型到引擎收录?当你完成后在这里发布这些链接。

在你进入引擎收录你正在使用...

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

这有几个原因无法正常工作。

首先 - 模型名称需要是单数。 I.E.艺术家=艺术家 其次 - 可包含行为没有“包含”功能,正确的功能名称也是单数。 I.E包含('ArtistImage')=包含('ArtistImage')

所以我FTFY,这里雅去。

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

希望能够为您澄清事情。 http://book.cakephp.org/view/474/Containable http://book.cakephp.org/view/22/CakePHP-Conventions

此外,这取决于蛋糕的版本使用的是我相信调用一个不存在的模型功能(即模型 - >包含(...))将尝试和调用存储过程mysql如果模型文件没有该名称的功能。

+0

BTW以下是错误: //错误 警告(512):SQL错误:1064:您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行[CORE/cake/libs/model/datasources/dbo_source.php,第514行]附近使用正确的语法。 //在查询列表中执行它的列表: 2包含1064:你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行的'contains'附近使用正确的语法。 – 2009-11-10 15:09:32

+0

$ this-> Artist-> recursive = 1; 不需要,Containable行为会为你排序。我没有在这里玩开发环境,但我认为这可能是什么导致你获取更多的信息比你所要求的。 – 2009-11-12 19:43:05

+0

帮我个忙,在所涉及的桌子上做一个mysql show create,为每个模型和控制器提供一个每个pastebin一张表以及一个pastebin。 我会在这里重新创建结构并看看。 – 2009-11-13 15:44:39

-1

该模型是专辑,所以它应该是$这个 - >专辑,而不是$这个 - >专辑

应用::进口(“模式”,“相册”);

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

+0

我试过这个改变,它仍然给出错误。 $这 - > Artist->包含( 'ArtistImage');但它确实会返回相关的项目,但它们都不是我选择的项目。另请参阅下面评论中的我的pastebin示例代码,这是最新的。 – 2009-11-10 12:52:57

+0

试试$ this-> Artist-> contains('ArtistImage'),其中没有s。你在条件内使用s。 – 2009-11-11 21:42:04