2013-10-31 95 views
1

我想做一個簡單的cakephp關聯程序,但它不工作。 我有兩個數據庫表:userssec_datas。當我運行這個程序時,它只顯示users表的第一行的結果,而不是兩個表具有相同的sec_id值的結果。Cakephp:協會不工作

控制器代碼:

<?php 
class UsersController extends AppController 
{ 
    public function index() 
    { 
     $this->autoRender = FALSE; 
     $this->loadModel('User'); 
     $storeDivisions = $this->User->find(); 
     echo "<pre>"; 
     print_r($storeDivisions); 
     echo "</pre>"; 
    } 
} 

型號代碼:

<?php 
class User extends AppModel { 
    public $useTable='users'; 

    public $hasOne = array(
     'Sec_data' => array(
      'ClassName' => 'Sec_data', 
      'Conditions' => array('User.sec_id=Sec_data.sec_id'), 
      'Dependent' => false 
     ) 
    ); 
} 
?> 
+0

對於初學者來說,你的'hasOne'數組鍵應該是小寫字母。 –

+1

這裏有很多錯誤/怪異/非常規。爲什麼模型類名稱中有一個下劃線?在模型別名中加入下劃線(關聯數組鍵)使得它基本上不可訪問。你不顯示執行的查詢 - 你是否要求'Sec_data'記錄但沒有找到?沒有包含或遞歸的信息 - 您是否根本不要求關聯記錄?User _actually_是您的模型類還是AppModel實例?總結:**它是否正常工作? – AD7six

+0

你必須通過$ this-> User-> recursive = 2; $ storeDivisions = $ this-> User-> find(); –

回答

1

如果用戶模型的主鍵是id然後蛋糕嘗試將外鍵Sec_data與該鍵不管條件您關聯組。所有的

首先,你應該做的domething像

public $hasOne = array(
    'Sec_data' => array(
     'ClassName' => 'Sec_data', 
     'ForeignKey' => 'sec_id', 
     'Dependent' => false 
    ) 
); 

,但只會如果如果你想Sec_data.sec_id有關User.sec_id(和用戶sec_id有關User.id

工作。 sec_id不同於User.id),那麼你必須手動加入表格

編輯:見評論

+0

有必要將外鍵設置爲false並定義條件以通過關聯定義實現具有相同sec_id值的兩個表的結果。手動連接不是必需的。 – AD7six

+0

謝謝@ AD7six。你能把這個解釋的官方文檔鏈接起來嗎? – arilia

+0

謝謝先生的幫助,它的工作 – user2398182

0

這裏有一些事情出錯了。您應該閱讀CakePHP的約定。

  • 您的相關模型類應該被稱爲SecData,那麼它會自動映射到sec_datas表。不需要使用loadModel
  • 無需指定條件。改爲設置正確的recursive級別。
  • 對於hasOne,只有一個表具有外鍵。默認情況下,其他Model有它(「User hasOne SecData」 - > SecData有外鍵)。因此,在您的示例中,您應該從User刪除列sec_id,並將user_id列添加到您的SecData型號。

參見:CakePHP Book on associations

更新控制器代碼:

<?php 
class UsersController extends AppController { 
    public $uses = array('User'); // Do this instead of loadModel 

    public function index() { 
     $this->autoRender = FALSE; 

     $this->User->recursive = 1; // Make User load associated records 
     $storeDivisions = $this->User->find('all'); 
     pr($storeDivisions); // pr() is a Cake shorthand for print_r wrapped in <pre> 
    } 
} 

對於你的模型:在蛋糕PHP

<?php 
class User extends AppModel { 
    // Unecessary. Convention is to use lowercase classname + 's', which 
    // already gives us 'users' 
    // public $useTable='users'; 

    public $hasOne = array(
     'SecData' => array(// Model class Sec_Data must be renamed accordingly 
      'dependent' => false 
     ) 
    ); 
} 
?>