2011-04-13 2 views
12

나는 sql과 php 주위에서 머리를 감싸는 방법을 배우고 있습니다. 당신은 테이블의 숫자를 포함 모양의 숫자를 포함하는 슬라이드의 숫자를 포함하는 프로젝트를 의미 포인트까지 id로 모든 방법을 연결되어 볼 수 있듯이A 다음을 수행 할 Select 문

+-----------+ +------------+ +---------+ +----------+ 
| Project | | Slide  | | Shape | | Points | 
+-----------+ +------------+ +---------+ +----------+ 
| id  | | id  | | id  | | id  | 
+-----------+ | project_id | | cont_id | | shape_id | 
       +------------+ +---------+ | x  | 
                | y  | 
                +----------+ 

을 다음과 같이 나는 구조 4 개 테이블이 전철기.

나는 SQL 쿼리를 가지고

SELECT slide.`id`, shape.`id`, points.`x_point`, points.`y_point` 
FROM `project`, `slide`, `shape`, `points` 
WHERE 1 = slide.`project_id` 
    AND slide.`id` = shape.`slide_id` 
    AND shape.`id` = points.`shape_id` 

내가 원하는 것은 내가 원하는 것은에 쓰레기의이 짐승 같은 배열을 변환하는 것입니다이

[0] => stdClass Object 
    (
     [id] => 27 
     [x] => 177 
     [y] => 177 
    ) 

[1] => stdClass Object 
    (
     [id] => 27 
     [x] => 178 
     [y] => 423 
    ) 

[2] => stdClass Object 
    (
     [id] => 27 
     [x] => 178 
     [y] => 419 
    ) 

[3] => stdClass Object 
    (
     [id] => 27 
     [x] => 178 
     [y] => 413 
    ) 

[4] => stdClass Object 
    (
     [id] => 27 
     [x] => 181 
     [y] => 399 
    ) 

[5] => stdClass Object 
    (
     [id] => 27 
     [x] => 195 
     [y] => 387 
    ) 

[6] => stdClass Object 
    (
     [id] => 27 
     [x] => 210 
     [y] => 381 
    ) 

[7] => stdClass Object 
    (
     [id] => 27 
     [x] => 231 
     [y] => 372 
    ) 

[8] => stdClass Object 
    (
     [id] => 27 
     [x] => 255 
     [y] => 368 
    ) 

[9] => stdClass Object 
    (
     [id] => 27 
     [x] => 283 
     [y] => 368 
    ) 
... AND CONTINUED FOR A LONG TIME 

모습이 쿼리의 결과를 가지고하는 것입니다 이보다 더 닮은 것

[9] => stdClass Object 
     (
      [id] => ID OF LIKE SHAPES 
      [x] => Array(ALL THE X POINTS) 
      [y] => ARRAY(ALL THE Y Points) 
     ) 

나는 인생의 전환점이 될 수 없다. 그런 배열이다.

내가 수행 한 쿼리로 수행 할 수없는 경우 더 나은 쿼리가 있습니다. 어쩌면 다음 포인트를 잡고 그 점의 ... 난 그냥 아이디어를 가지고 생각 배열로두고 필요 하나 ...


새로운 정보,

그래서 나는 대답을 추가 이 질문에, 그것이 표준 방법인지 나는 모른다. 내 대답이 다른 해결책을 돕기 위해 좋은 해결책이 아니라면 여기에 내 사고 과정을 추가 할 것입니다.

자세한 내용은 내 대답을 확인하십시오.

ORM은 내 알고리즘과 어떻게 비교됩니까? Doctrine 같은 ORM을 사용

+4

+1 제공된 정보 및 문구. :) 나는 "허풍의 짐승 같은 배열"이 PHP와 [My] SQL을 모두 잘 설명한다고 생각합니다. –

+1

ORM을 사용하려는 것 같습니다. [Doctrine] (http://www.doctrine-project.org/)은 간접비가 관련되어 있지만 매우 잘 수행합니다 – Phil

+1

@ Phil Brown 계속 ... – austinbv

답변

3

, 당신은 단순히

은 물론 http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#one-to-many-bidirectional

보기 ... 등등

/** 
* @Entity 
*/ 
class Project 
{ 
    /** 
    * @Id @GeneratedValue 
    * @Column(type="integer") 
    */ 
    private $id; 

    /** 
    * @OneToMany(targetEntity="Slide", mappedBy="project") 
    */ 
    private $slides; 

    public function __construct() 
    { 
     $this->slides = new \Doctrine\Common\Collections\ArrayCollection; 
    } 
} 

/** 
* @Entity 
*/ 
class Slide 
{ 
    /** 
    * @Id @GeneratedValue 
    * @Column(type="integer") 
    */ 
    private $id; 

    /** 
    * @ManyToOne(targetEntity="Project", inversedBy="slides") 
    * @JoinColumn(name="project_id", referencedColumnName="id") 
    */ 
    private $project; 

    /** 
    * @OneToMany(targetEntity="Shape", mappedBy="slide") 
    */ 
    private $shapes; 
} 

그리고처럼 모델링 것, 설정 및 처리의 상당량이있다 오버 헤드가 수반되지만 도메인 모델이 복잡해지면 ORM을 높이 평가할 수 있습니다.

<?php 
$newStdClass['id'] = $stdClass[$i]['id']; 
for($i=0;$i<count($stdClass);$i++) 
{ 
    $newStdClass['x'][] = $stdClass[$i]['x']; 
    $newStdClass['y'][] = $stdClass[$i]['y']; 
} 
?> 

당신이 말한대로 은 $ sttClass 쓰레기의 배열입니다 가정 : D

+0

질문에 대한 귀하의 의견 이래 읽기 및 호스트에 설치되지 않았거나 설치할 수있는 기능이 없습니다. ( – austinbv

+0

@zobgib 요구 사항은 PHP 5.3이며, 설치가 가능하다면 – Phil

+0

아, 고맙습니다. 정말 다른 솔루션을 원합니다. 단기적으로는 다른 소프트웨어를 배우는 것이 언제나 고통 스럽기 때문에 . – austinbv

0

나는이 도움이되기를 바랍니다.

1

저는 잠시 동안 작업을 해왔으며, 제 대답을 생각해 냈습니다. 나는 아마도 이것이 BAD 방법이라고 생각하기 때문에 입력을 좋아할 것입니다.

여기 내 생각 프로세스입니다. 하나의 쿼리는 훌륭하지만 결과 배열을 점진적으로 빌드하면 어떨까요? 우리가 의미하는 바는 설계된 SELECT 문을 사용하여 결과 배열을 만들 수 있다는 것입니다.

다음은 단지 단어로 알고리즘을 설명하기가 어렵 기 때문에 주석으로 작성했습니다.

/* $cur_project is set above from an input value. Assume any int 
    The algoritim Traverses a series of results and puts them into the proper places in a usable array. 
    The algorithim has an query count of NumberOfSlides + 2(NumberOfSlides)+1 which seems really high 
    For real word application if querying the DB is as bad as everyone says. 
*/ 
// A blank array to build up 
$projectArray = Array(); 

// I just want to see how many queries this thing generates 
$queryCount = 0; 

// Query 1 - This query will get all slides in a project. 
$slide_id = $this->db->query('SELECT slide.`id` 
           FROM `slide` 
           WHERE slide.`project_id` = '.$cur_project); 
$queryCount++; 

//Now traverse the results to Query 1 
foreach ($slide_id->result() as $slide_id){ 
    // In the project array add an element with the key that is 
    // the slide_id for all slides in that project. Then for each 
    // key also create a new empty array at each added element 
    $projectArray[$slide_id->id] = Array(); 

    // Query 2 - grab all the shapes that match the current slide in the current project! 
    // This is where things get inefficient. 
    $shape_id = $this->db->query('SELECT shape.`id` 
            FROM `shape` 
            WHERE shape.`slide_id` = '.$slide_id->id 
           ); 
    $queryCount++; 

    // Traverse the results to Query 2 
    foreach ($shape_id->result() as $shape_id) { 
     // For every slide now create a key that matches the shape and fill that array with 
     // info I need such as an array of the points. 
     $projectArray[$slide_id->id][$shape_id->id] = Array(
              'x_points' => Array(), 
              'y_points' => Array() 
             ); 
     // Query 3 - Ask the DB for x/y points for the current shape. You can see how for slides with lots of shapes 
     $points = $this->db->query('SELECT points.`x_point`, points.`y_point` 
            FROM `points` 
            WHERE points.`shape_id` = '.$shape_id->id 
           ); 
     $queryCount++; 
     // Traverse the Query 3 results 
     foreach ($points->result() as $point) { 
      // Populate the final arrays with the points 
      $projectArray[$slide_id->id][$shape_id->id]['x_points'][] = $point->x_point; 
      $projectArray[$slide_id->id][$shape_id->id]['y_points'][] = $point->y_point; 

     } 
    } 
} 

위는이 솔루션을

Array 
(
    [SLIDE_ID] => Array 
     (
      [SHAPE_ID] => Array 
       (
        [x_points] => Array 
         (
          [0] => 177 
          [1] => 178 
          [2] => 178 
          [3] => 178 
          [4] => 181 
... 

내 문제로 해석 될 수있는

Array 
(
    [1] => Array 
     (
      [27] => Array 
       (
        [x_points] => Array 
         (
          [0] => 177 
          [1] => 178 
          [2] => 178 
          [3] => 178 
          [4] => 181 
... 

과 같이 내 최고 주석에 말하는 것입니다 보이는 배열을 반환합니다. 난 당신이 대답에 나열된 원래 결과에 대한 배열 검색과 함께 이러한 결과를 복제 할 수 있다고 생각합니다. 그것은 더 나쁘게 보인다.

나에게 도움이 될만한 의견이 있으면 개선해주십시오.

고마워요.