2011-12-19 79 views
2

我正在我的作業控制器中運行以下內容。cakePHP 2.0 find('threaded')問題

$this->set('jobs', $this->Job->find('threaded', array('conditions' => array('Job.id' => 20)))); 

現在,在我看來,我在我的foreach循環精細顯示$jobs,但我的問題是我一直在使用現場PARENT_ID掛Job.id孩子。我知道鏈接工作正常,因爲我可以看到數組中的孩子。

Array 
(
[0] => Array 
    (
     [Job] => Array 
      (
       [id] => 20 
       [parent_id] => 0 
       [rght] => 2 
       [lft] => 1 
       [client_id] => tasd 
       [contact] => asdf 
       [email] => sdf 
       [address] => 
       [lat] => 
       [long] => 
       [user_id] => 1 
       [request_type_id] => Electrical 
       [date_start] => 0000-00-00 00:00:00 
       [date_end] => 0000-00-00 00:00:00 
       [date_complete] => 0000-00-00 00:00:00 
       [date_closed] => 0000-00-00 00:00:00 
       [status] => completed 
       [brief_desc] => aasdf 
       [desc] => asdfasdf 
       [cost_est] => 3434.00 
       [cost_actual] => 
       [created] => 2011-12-18 20:39:24 
        [modified] => 2011-12-18 20:39:24 
      ) 


     [Children] => Array 
      (
       [0] => Array 
        (
         [id] => 21 
         [parent_id] => 20 

我想在父作業下顯示子作業。具體嵌套評論應該如何工作。任何幫助都會很棒。

回答

6

看那個find('threaded')正在生成SQL。您要求所有喬布斯的ID爲20(而不是所有喬布斯是喬布斯的子女)

由於您有一個lft和rght字段,我假設您已經附加了樹行爲。這意味着您可以使用children()。但是,這會給你一個平坦的數組,而不是一個嵌套的數組。如果您需要嵌套數組,請使用find('threaded')調用中的lft和rght列。

$parentJob = $this->Job->find('first', array(
    'conditions' => array(
     'Job.id' => 20 
    ) 
); 

$children = $this->Job->find('first', array(
    'conditions' => array(
     'Job.lft BETWEEN ? AND ?' => array($parentJob['Job']['lft'], $parentJob['Job'])['rght'] 
    ) 
); 

當然,你可以獲取到一個單一的查詢,但我會離開,「作爲一個練習留給讀者」(我應該是一本教科書作家)

+0

謝謝達科他,看來我現在回來的數組看起來更像我需要使用的數組。什麼是最好的PHP代碼來讀取這個數組。我正在使用的正常的foreach語句根本不起作用。 – AshHimself 2011-12-20 03:27:18

+0

您需要使用遞歸函數(理想情況下)。看看chetan patel發佈的鏈接。這可能是非常過時的,但助手類應該給你一個好主意該怎麼做(搜索頁面** app/views/helpers/tree.php **) – Dakota 2011-12-20 10:49:11

+1

這個答案很好,我知道這是舊的,但括號不足以結束聲明,我相信第二個發現應該是「線程化」而不是「第一個」 – 2015-08-13 02:20:08

1

如果有人要顯示視圖的CakePHP的發現( '擰')的結果,就可以利用這一點:

控制器代碼:

$params = array('recursive' => -1,'fields' => 'Category.id, Category.name, Category.parent_id'); $categories = $this->Category->find('threaded',$params);

並顯示您的日readed結果鑑於這樣的:

foreach($categories as $category): 
     $category_name = $category['Category']['name']; 
     foreach($category['children'] as $children): 
       $sub_category = $children['Category']['name']; 
     endforeach; 
endforeach; 

我不知道它的顯示結果或不正確的方法,但它的正常工作。 希望對某人的幫助:) 我是cakephp和學習基礎知識的新手。如果發現任何錯誤,請原諒我。