2011-12-12 52 views
0

好吧,我有兩個表格,用戶和單位。 '單位'屬於'用戶','用戶'有許多'單位'。我想訪問我的單位表中的所有數據,並將我的用戶表中的部分數據添加到視圖中。這裏是我的控制器代碼:另一個「需要從cakephp中的兩個表中提取數據」

public function condos() { 
    $u=$this->User->Unit->find('all', array('conditions'=>array('type'=>'condo',  'active'=>1))); 
    $this->set('allcondos', $u); 
} 

我有兩個型號,用戶和組,這裏是它們的代碼: 從unit.php:

class Unit extends AppModel { 
    var $name='Unit'; 
    var $belongsTo=array(
     'User'=>array(
     'className'=>'User', 
     'foreignKey'=>'user_id' 
    )); 
} 

和user.php的:

class User extends AppModel { 
    var $name='User'; 
    var $hasMany=array(
     'Unit'=>array(
     'className'=>'Unit', 
     'foreignKey'=>'user_id' 
    )); 
} 

這裏是我的視圖代碼:

<?php foreach ($allcondos as $condo) { ?> 

<section class="listings"> 
<figure> 
<img src="<?php echo $condo['Unit']['photo1']; ?>" /> 
</figure> 
<h1><?php echo $condo['Unit']['complex'], ' ', $condo['Unit']['unitnum']; ?></h1> 
<h2><?php echo $condo['Unit']['city']; ?>, <?php echo $condo['Unit']['state']; ?> | (<?php echo $condo['User']['area_code']; ?>)<?php echo $condo['User']['exchange'];?>-<?php echo $condo['User']['sln'];?></h2> 
<p><?php echo $condo['Unit']['unit_desc']; ?></p> 
</section> 
<?php } ?> 

我對$ condo ['User'] ['any_field']的調用有問題,因爲它返回零'User'數據。 (它返回'單元'數據就好了)。顯然,我不知道如何訪問兩個表。

如果我在視圖中進行調試$ allcondos,它看起來像這樣:

Array 
(
    [0] => Array 
    (
     [Unit] => Array 
      (
       [id] => 1 
       [user_id] => caribeincrentals 
       [additional fields] ... 
      ) 

     [User] => Array 
      (
       [id] => 
       [user_id] => 
       [additional fields] ... 
      ) 

    ) 
    [1] => Array ... 
) 
+0

什麼是你的表格結構? – Farray

+0

我有一個表的用戶,有一堆的信息,包括'user_id'字段。我有一個單位表,有一堆信息,包括'user_id'字段。我改變了我的代碼在我的控制器再次說這個:public function condos(){$ this-> User-> Unit-> Behaviors-> load('Containable'); $ u = $ this-> User-> Unit-> find('all',array('conditions'=> array('Unit.type'=>'condo','Unit.active'=> 1),'包含'=> array('User'))); $ this-> set('allcondos',$ u); }現在我得到單元數據,爲用戶表加上FIELDS,但在關聯數組中沒有數據字段 – huzzah

+0

如果忽略'containsable'行爲,而是在'find()'中指定'recursive', ? – Farray

回答

0

沒有你的數據庫的詳細信息,這是很難說究竟是怎麼回事。但是,您似乎將字符串值用作將您的2個模型鏈接在一起的外鍵。這是一個壞主意。

我建議將user_id fk更改爲引用Users表上的id鍵列的int數據類型(當然,假設id是一個自動遞增整數值)。

這很難說如果這是確切的問題,但它絕對值得檢查,並會幫助您避免未來的其他一些令人頭疼的事情。

UPDATE

如果根據蛋糕慣例構造你的表,大部分的關聯工作都會爲你做。這是我會怎麼做:

用戶表( '用戶'):

id  primary key (int) 

用戶模式:

$hasMany = array('Unit'); 

單位表( '單位'):

id  primary key (int) 
user_id corresponds to id in users table 

單位型號:

$belongsTo = array('User'); 

如果您設置了&這樣的表格,Cake會自動將units表中的'user_id'與users表中的'id'相關聯。

+0

你能向我解釋爲什麼這是一個壞主意嗎?如果我有x個用戶,每個用戶可能有x個單位,我如何通過id匹配他們,因爲它是自動增量的?我很困惑。我以爲我應該在每張桌上有一個與另一個完全匹配的場地? – huzzah

+0

@ HeatherWalters它會給你帶來額外的維護負擔。 'id'已經是唯一的,自動遞增(有一個默認值),並且很小。 'user_id'作爲文本/ varchar字段需要更多的空間,精心定義的約束等等。如果你想改變'user_id'值,它也會導致大量的更新負擔(從而威脅你的數據庫一致性)。最好有一個用戶友好的'user_id'字段,僅用於*顯示目的*,並在後臺使用所有fk關聯的'id'字段。 – Farray

+0

因此,在我的兩個AppModel.php文件中,我該如何「建立關聯」?我怎麼說User.id綁定到具有「someuser」的user_id的每個Unit.id? – huzzah

1
$this->Unit->find('all', array(
     'conditions' => array(
      'type' => 'condo', 
      'active' => 1, 
     ), 
     'contain' => array(
      'User', 
     ), 
    )); 

使用中可容納得到相關的數據。您也可以使用該內容中的條件來限制您想要的信息。

http://book.cakephp.org/view/1323/Containable

+0

嗯,它仍然不拉任何'用戶'數據。好像我仍然錯過了一些東西。 – huzzah

+0

我改變了我的控制器代碼。公共職能公寓(){ \t $ this-> User-> Behaviors-> load('Containable'); \t $ u = $ this-> User-> contains('Unit'); \t $ u = $ this-> User-> find('all'); \t $ this-> set('allcondos',$ u); \t \t} \t這並不是將模型聯繫在一起顯然是因爲現在我得到我的所有數據爲用戶,但不是爲單位。 – huzzah

相關問題