2013-06-05 27 views
1

這是一個非常基本的問題,但在the book中沒有解釋。CakePHP:Model-> Model-> find()

在查找方法之前將多個模型拼接在一起時會發生什麼?

例:$stuff = $this->Article->User->find('all');

這是如何不同於:$this->User->Article->find('all');

你可以做超過兩個? $this->Book->Chapter->Author->find('all');

很明顯它與模型之間的關係有關,但我認爲這些模型是在模型中定義的,所以我不清楚發生了什麼。

回答

5

在模型上設置關聯時。 CakePHP在運行時對它進行實例化,並將其設置爲該模型的Object屬性。

class User extends AppModel 
{ 
     public $hasMany = array('Document'); 
} 

class Document extends AppModel 
{ 
} 

在上面的例子中。 User對象將包含名爲Document的屬性,但Document將不包含User

class UsersController extends AppController 
{ 
    public $uses = array('User'); 

    public function index() 
    { 
      $this->User-find(...); // works 
      $this->User->Document->find(..); // works, because of the hasMany 

      $document = ClassRegistry::init('Document'); 
      $document->User->find(...); // does not work, not associated to User. 
    } 
} 

另外,請記住,屬性的名稱是關聯的別名。不是模型的名稱。

class User extends AppModel 
{ 
     public $hasMany = array(
      'Paper'=>array('className'=>'Document') 
    ); 
} 

class Document extends AppModel 
{ 
} 

這改變了屬性名稱Paper

$this->User->Paper->find(..); // works as alias 

用途上關聯的別名,可以應用找到條件,使他們產生不同的結果。

class User extends AppModel 
{ 
     public $hasMany = array(
      'Paper'=>array('className'=>'Document','conditions'=>array(....)), 
      'Resume'=>array('className'=>'Document','conditions'=>array(....)) 
    ); 
} 

這將爲User模型創建兩個屬性,如下所示。

$this->User->Paper->find(..); // works as alias 
$this->User->Resume->find(..); // works as alias 

但是,在條件上User模型來進行查找時,才適用。

+0

這是有幫助的,並解釋何時可以使用。但我仍然不清楚它究竟在做什麼。換句話說,如果有的話,返回的數據是如何影響的? – emersonthis

+1

如果我具體問一下,可能會更清楚:正在搜索哪個模型?鏈中的最後一個?或者正在搜索? '$ this-> User-> Paper-> find('all')'是否會返回所有文檔?或文件和用戶? – emersonthis

+1

'$ this-> User-> Document == $ this-> Document'爲true。這兩個對象是'Document'模型的同一個實例。 Cake將'Document'作爲成員屬性設置爲'User'以方便訪問。在你的控制器中,你不必說'uses = array('User','Document')'。由於'用戶'已經有了'文檔'的引用。你也不需要在'User'模型中調用'ClassRegistry :: init('Document')'。 – cgTag