2015-06-12 67 views
1

我正在使用CakePHP 2.6.7。在CakePHP2中將模型鏈接在一起的麻煩

這裏是我的數據庫(簡化):

***Users*** 
id 
username 

***Cars*** 
id 
CarMake 
CarModel 
NumberPlate 
user_id 

***Addresses*** 
id 
address 
postalcode 
city 
country 

***Addresses_Users*** 
user_id 
address_id 

這就是我想要的東西:

  • 一個用戶可以擁有多個汽車和一輛車僅由一個用戶擁有。
  • 一個用戶可以擁有多個用戶擁有多個地址和一個地址。
  • 一輛車可以有多個地址,一個地址可以由多輛車擁有。

所以現在我有一個模型user.php的:

<?php 
class User extends AppModel { 

    public $hasMany = array(
     'Car' => array(
      'classname' => 'Car') 
    ); 

    public $hasAndBelongsToMany = array(
     'Address' => array(
      'classname' => 'Address') 
    ); 
?> 

和模型Car.php:

<?php 
class Car extends AppModel { 

    public $belongsTo = array(
     'User' => array(
      'className' => 'User' 
     ) 
    ); 

    public $hasMany = array(
     'Address' => array(
      'classname' => 'Address') 
    ); 
} 
?> 

和模型Address.php:

<?php 
class Address extends AppModel { 

    public $belongsTo = array(
     'User' => array(
      'className' => 'User' 
     ), 

     'Car' => array(
      'classname' => 'Car') 
    ); 
} 
?> 

我試圖連接汽車與地址,但我不能得到它的工作... 如果我做一個debug($this->User->find());我有這樣的結果:

array(
'User' => array(
    'id' => '1', 
    'username' => 'wblondel', 
), 
'Car' => array(
    (int) 0 => array(
     'id' => '2', 
     'CarMake' => 'Allard', 
     'CarModel' => '2005', 
     'NumberPlate' => '56QDS1', 
     'user_id' => '1', 
    ), 
    (int) 1 => array(
     'id' => '5', 
     'CarMake' => 'Alvis', 
     'CarModel' => '25', 
     'NumberPlate' => '5lDS1', 
     'user_id' => '1', 
    ) 
), 
'Address' => array(
    (int) 0 => array(
     'id' => '2', 
     'address' => 'fghfghgf', 
     'postalcode' => '78200', 
     'city' => 'buchelay', 
     'country' => '40' 
    ), 
    (int) 1 => array(
     'id' => '3', 
     'address' => 'jkjkjk', 
     'postalcode' => '69100', 
     'city' => 'villeurbanne', 
     'country' => '59' 
    ) 
) 
) 

我會首先想的是,在每節車廂有一個數組的「地址」 ......

謝謝!

回答

2

從你所描述的你的關聯看起來錯了。他們應該是這樣的: -

用戶

<?php 
class User extends AppModel { 

    public $hasMany = array(
     'Car' 
    ); 

    public $hasAndBelongsToMany = array(
     'Address' 
    ); 
} 

汽車

<?php 
class Car extends AppModel { 

    public $belongsTo = array(
     'User' 
    ); 

    public $hasAndBelongsToMany = array(
     'Address' 
    ); 
} 

地址

<?php 
class Address extends AppModel { 

    public $hasAndBelongsToMany = array(
     'Car', 
     'User' 
    ); 
} 

你不需要使用className,除非要使用的別名與型號名稱不同或型號屬於插件。

然後,如果你使用Containable behavior,你應該能夠得到一切恢復使用類似: -

$this->User->find(
    'all', 
    array(
     'contain' => array(
      'Address', 
      'Car' => array( 
       'Address' 
      ) 
     ) 
    ) 
); 
+1

謝謝!通過使用你的關聯和在我的數據庫中創建缺失的表格,它可以工作!我無法用你提出的建議讓所有事情都回來,但沒關係,我可以通過「$ this-> user-> car-> find('all')獲得Cars的地址。 –

1

要控制從find()查詢中檢索的確切內容,可以使用ContainableBehavior

順便說一句,我認爲你在你的Address模型中有一個錯誤,因爲地址不屬於「屬於」用戶,但可以有許多。它應該是您在User模型中完成的HABTM關係。

+0

謝謝您的通知::) –