2010-12-28 5 views
0

첫 번째 질문은 내가 독창적 인 개발자이기 때문에 다른 사람들이 아이디어를 던지기를 놓친 것 같습니다. 나가거나 문제가 생겼을 때 아이디어를 얻거나 이 문제를 해결할 수있는 사이트가 있습니까? 가상 공동 프로그래머 사이트처럼? 아니면 StackOverflow가 그렇게 작동합니까?PHP/CodeIgniter의 "steps", "sub-steps", "sub-sub-steps"을 반복합니다.

내 주요 질문 : "할 일"목록과 같은 작업을하고 있지만 각 항목에는 하위 단계가 있거나 하위 단계가있을 수 있습니다.

$i = new Item(); 
$i->where('parent_id',0)->get(); 
foreach($i as $item) { 
    echo $item->item; 
    $si = new Item(); 
    $si->where('parent_id',$item->id)->get(); 
    foreach($si as $subItem) { 
     echo $subItem->item; 
     // and so on 
    } 
} 

그것을 : 나는 모든 최상위 항목 CodeIgniter의에서 Datamapper ORM을 사용하여 PARENT_ID = 0을 갖는, 필드 "ID, 항목, PARENT_ID"있는 테이블을 가지고, 나는 이것을 사용하고 있습니다 이 작업을 수행하는 더 똑똑한 방법이 있습니까? 어떤 종류의 재귀 함수가 있을까요?

나는 다른 사람이 관리하는 모든 것을 갖기 위해 노력하고 있습니다. 그래서 그들은 그들이 갈 필요가있는 항목을 끌어 놓기 만 할 수 있습니다. 그러나 다른 날에는 완전히 다른 문제입니다.

답변

0

Smth가 테스트되지 않음 : count ($ ss)가 쿼리에서 반환 된 결과가 있는지 확인하기 위해 좋은 값을 반환하지 않을 수 있으므로 필요한만큼 업데이트하십시오 (Zend에서는 Zend_Db_Table_Rowset에서 계산할 수 있지만 그렇지 않은 경우). 슈어 어떤 객체 CI 반환하고 결과의 수를 셀 수 있다면 당신이 당신의 자신의 SQL을 작성하는 경우 한 Statment는 결과가있는 거 쿼리에서 반환이있는 경우에만 기능)

function recursive($i) 
    { 
     foreach ($i as $item) 
     { 
      echo $item->item; 
      $si = new Item(); 
      $ss = $si->where('parent_id', $item->id)->get(); 
      if (count($ss) > 0) 
       recursive($ss); 
     } 
    } 
    $i = new Item(); 
    recursive($i->where('parent_id', 0)->get()); 
3

를 호출하는 경우)를 업데이트하십시오, 당신 3 쿼리 에서이 일을.

"SELECT * FROM items WHERE parent_id = 0;" 
"SELECT * FROM items WHERE parent_id IN (SELECT id FROM items WHERE parent_id = 0;" 

그러나, 당신은 당신이 원하는처럼 봐 tree-like structure 다중 중첩 :

| item | 
    | sub-item | 
    | sub-sub-item | 

당신이 CI를 사용하는 경우는, (내 생각에) 자체 참조를 처리하는 Doctrine라는 더 나은 ORM있다 나무 같은 데이터 구조 (당신이 제안한 재귀를 사용). 고맙게도 CodeIgniter에 통합 한 멋진 기사가 있습니다!

http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup

당신이

교리 쿼리를 구축 할 것 - 그것은 또한 관계를 지원 이그나이터가 부족 :) 내가 당신이라면

+0

이 작업을 수행하셨습니까 ?? – sethvargo

+0

불행히도, Doctrine으로 전환하기에는 너무 멀었습니다. 그러나 설명서를 읽으면 Datamapper가 비슷한 것을 할 수 있다는 것을 알게되었습니다. – TerryMatula

+0

당신은 CI의 datamapper가 광범위한 프로젝트를 위해 subpar이고 느리다는 것을 알게 될 것입니다. – sethvargo

3

, 내가 AA를 구현 보는 것 캐싱과 같은 다른 편리한 기능이 많이 트리 구조. 근본적으로 여기에있는 인접성리스트 (DB 관점에서 보았을 때 당신이 작성하고 테스트해야하는 PHP 코드)에 대한 기반을 설정했습니다. level 열을 추가하여 주어진 작업이 계층 구조에있는 수준을 정의하면 자체 결합으로 1-2 개의 쿼리로 모든 데이터를 가져올 수 있지만 중첩 수준이 상당히 낮 으면 속도가 느려집니다.

다른 방법으로는 각 노드에 대해 여러 가지 분기가 필요하지 않은 것보다 특히 많은 작업이 필요한 중첩 세트 및 Preorder Tree Traversal을 사용할 수 있습니다.

두 가지를 DB 측면에서 자세히 설명하는 Managing Hierarchical Data in MySQL을 살펴보십시오. MySQL과 관련하여 특정 사항이 있지만 DB와 상관없는 방식이나 다른 특정 DB에 대해 동일한 원칙을 적용 할 수 있어야합니다.

당연히 당신은 지금하고있는 것보다 더 많은 일을하는 PHP 쪽에서 매핑을 구현해야합니다.DB 수를 줄일 수 있습니다.

CI Datamapper 대신 Doctrine (Seth도 권장 됨)을 사용하는 것이 좋습니다 ...이 모든 것이 이미 구현되어 있습니다 ... Doctrine의 기초를 배우고 CI에 연결해야합니다. 나는 많은 수의 튜토리얼이 있다고 확신한다.

+0

그것은 모두 mySQL이고, 당신이 링크 한 의사가 훌륭했습니다. 감사! – TerryMatula