2014-10-07 40 views
0

我正在編寫我的第一個Cake應用程序並試圖設置我的第一個深度關聯。它幾乎工作,但我有幾個小問題。與CakePHP進行深度關聯的表單,幾乎可以工作

我的應用程序的第一部分是客戶數據庫。一個客戶有很多地址,並且一個地址有很多聯繫人。返回的數據結構包含來自地址模型的重複數據。

Here's the 3 models: 

class Customer extends AppModel { 
    public $hasMany = 'CustomerAddress'; 
} 

class CustomerAddress extends AppModel { 
    public $belongsTo = 'Customer'; 
    public $hasMany = 'CustomerContact'; 
} 

class CustomerContact extends AppModel { 
    public $belongsTo = 'CustomerAddress'; 
} 

在我的客戶控制器中,我想獲取關聯的地址及其聯繫人。我可以通過find命令遞歸設置做到這一點:

CustomerController.php 

public function find($id = NULL) { 
    $this->set('customers', $this->Customer->find('all', array('recursive' => 2))); 
} 

這出色的作品,有一點需要注意。數據結構返回這個樣子的:

array(
    'Customer' => array(
     'id' => '46', 
     .... 
    ), 
    'CustomerAddress' => array(
     (int) 0 => array(
      'id' => '35', 
      'customer_id' => '46', 
      ..... 

      'Customer' => array(
       'id' => '46', 
       ..... 
      ), 
      'CustomerContact' => array(
       (int) 0 => array(
        'id' => '29', 
        'customer_address_id' => '35', 
        ..... 
       ) 
      ) 
     ) 
    ) 
) 

一目瞭然,這看起來不錯,併爲所有意圖和目的的數據被格式化你如何期望的工作。但是,CustomerAddress也包含一個Customer對象,它是頂級Customer對象的副本。我認爲這是因爲遞歸與地址模型中的belongsTo一起工作。

我試着將遞歸設置爲1,但後來我只得到地址而不是聯繫人。我已經嘗試在地址模型中設置遞歸,但這似乎不會影響客戶級別的查找。

這不是一個大問題,只是擔心未來的性能問題和不必要的數據庫調用。

回答

1

這是不鼓勵使用遞歸設置的原因之一。大多數關閉遞歸(將其設置爲-1),然後使用Containable行爲來獲取關聯的模型。確保在AppModel,有行

public $actsAs = array('Containable'); 

然後,讓你的數據:

$this->Customer->find('all', array('contain' => array('CustomerAddress' => array('CustomerContact')))); 
+0

乾杯!我在看可遏制的東西,但食譜似乎在推動他們限制返回的字段。這很好。希望你能幫助我的下一個問題:) – Dabrowski 2014-10-07 16:13:43

相關問題