2009-11-07 90 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