2013-12-10 42 views
1

我有一個數據庫:CakePHP的(2.4)很深的關係

Companies | Users | Files 
- ID    - ID   - ID 
        - company_id - user_id 

所以對我的模型:

  • 公司的hasMany用戶
  • 用戶屬於關聯公司&的hasMany文件
  • 文件屬於關聯用戶

如何列出屬於公司的文件? 沒有的用戶和公司的數據?所以單個數組列出文件。

我可以在使用這些ID進行文件搜索時獲取所有用戶ID,然後查詢。但我想知道,有沒有一種最佳實踐CakePHP的方式?

我對蛋糕相當陌生。

感謝

回答

1

據我所知,無法獲取沒有任何用戶或公司數據的公司文件,但可以通過使用Containable behaviour來限制數據。例如,如果你想獲得屬於某個公司,在公司負責人的文件,你可以這樣做:

$users = $this->Company->User->find('all', array(
    'conditions' => array('User.company_id' => $id), 
    'fields' => array('id', 'company_id'), 
    'contain' => array('File'), 
)); 

結果($users)將是這個樣子:

array(
    0 => array(
     'User' => array(
      'company_id' => '75', 
      'id' => '51' 
     ), 
     'File' => array(
      0 => array(
       'id' => '399', 
       'user_id' => '51', 
       ... 
      ), 
      1 => array(
       'id' => '337', 
       'user_id' => '51', 
       ... 
      ) 
      ... 
     ) 
    ) 
    1 => array(
     'User' => array(
      'company_id' => '75', 
      'id' => '65' 
     ), 
     'File' => array(
      0 => array(
       'id' => '450', 
       'user_id' => '65', 
       ... 
      ), 
      ... 
     ) 
    ) 
) 

你可以然後使用Hash utility獲取一組文件。

$files = Hash::extract($users, '{n}.File.{n}'); 

,這將給你這樣的事情:

array(
    0 => array(
     'id' => '399', 
     'user_id' => '51', 
     ... 
    ), 
    1 => array(
     'id' => '337', 
     'user_id' => '51', 
     ... 
    ), 
    3 => array(
     'id' => '450', 
     'user_id' => '65', 
     ... 
    ), 
    ... 
) 

不要忘記啓用的行爲。我建議你在你的應用模型中添加以下行:

public $actsAs = array('Containable'); 
+0

工程就像一個魅力。謝謝! – Lapidus

+0

現在我能夠將用戶名連接到同一個數組中的文件嗎? – Lapidus

+1

是的,Containable可以遞歸。 ('File')''包含'=> array('File'=> array('User'))或者'contains'=> array('File'=' > array('User'=> array('fields'=> array('username'))))'。 –

0

CakePHP會不會幫你在這個即使想寫MySQL查詢你不能使用文件表只有等到除非你將文件表中添加的company_id做到這一點。