2011-12-19 89 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和学习基础知识的新手。如果发现任何错误,请原谅我。