2011-12-19 2 views
2

Я запускаю следующее в своем контроллере Jobs.cakePHP 2.0 find ('threaded') Issue

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

Сейчас на мой взгляд, я отображая $jobs в моей петле штрафа foreach, но мой вопрос я детей связан с Job.id с использованием поля parent_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

Посмотрите на SQL, что find('threaded') является порождающей. Вы просите всех Рабочих мест с идентификатором 20 (вместо всех Рабочих мест, которые являются детьми задания 20)

Поскольку у вас есть поле lft и rght, я предполагаю, что у вас есть поведение Дерева. Это означает, что вы можете использовать children().

$this->Job->id = 20; 
$this->Job->children(); 

Однако это даст вам плоский массив, а не вложенный массив. Если вам нужен вложенный массив, используйте столбцы lft и rght в вызове find('threaded').

$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

Спасибо Dakota. Кажется, что массив, который я возвращаю, теперь больше похож на массив, который мне нужно использовать. Каков наилучший PHP-код для чтения этого массива. Нормальный оператор foreach, который я использую, не работает вообще. – AshHimself

+0

Вам нужно будет использовать рекурсивную функцию (в идеале). Посмотрите на ссылку, которую опубликовал chetan patel. Это может быть очень устаревшим, но класс-помощник должен дать вам хорошее представление о том, что делать (поиск страницы для ** app/views/helpers/tree.php **) – Dakota

+1

Этот ответ хорош, и я знаю, что это старый, но круглые скобки недостаточны для закрытия заявления, и я считаю, что вторая находка должна быть «резьбовой», а не «первой», –

1

Если кто-то хочет показать находку ('') резьбовой результат в связи с CakePHP, они могут использовать это:

Controller код:

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

И показать свой -й Результат в читаемые зрения, как это:

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

Я не знаю его правильный способ отображения результата или нет, но это работает отлично. Надеюсь, что это поможет кому-то :) Я новичок в разработке cakephp и обучении. Если вы обнаружите какую-либо ошибку, пожалуйста, простите меня.