2011-04-13 24 views
12

Yapacak Bildirimi Seçme Sadece başımı sql ve php'ye nasıl kaydırılacağını öğreniyorum. Eğer tablolar bir dizi içeren şekillerin bir numarası içeren slaytlar bir dizi içerecek bir projeyi anlam puan aşağı id tarafından tüm yol bağlantılıdır Görüldüğü gibiA Aşağıdaki

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

şöyle ben yapılandırılmış 4 tablolar puan.

Bir SQL sorgu sahip

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` 

İstediğim İstediğim içine bok bu sevimsiz dizi dönüştürmek için bu

[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 

benziyor bu sorgunun sonuçlarını almaktır daha andıran bu

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

beni hayat için th dönüştürmek için nasıl bilemiyorum şey böyle bir dizidir.

Tasarladığım sorgu ile yapılamazsa daha iyi bir sorgu var. Belki o zaman noktaları çeken bu noktaların ... Ben sadece bir fikir var düşünüyorum bir dizi içerisine koyar alır biri ...


Yeni Bilgi,

Yani bir cevap ekledi Bu soruya, standart yol olup olmadığını bilmiyorum. Benimki iyi bir çözüm değilse diğer cevaplara yardım etmek için düşünce sürecimi de buraya ekleyeceğim.

Daha fazla bilgi için benim cevabım hakkında bilgi edinin.

Ayrıca bir ORM algoritmamla nasıl kıyaslar? Doctrine gibi bir ORM kullanma

+4

+1. :) Ben beastly boktan bir dizi düşünüyorum hem PHP hem de [My] SQL oldukça iyi açıklar. –

+1

Bir ORM kullanmak istediğiniz gibi görünüyor. [Doktrini] (http://www.doctrine-project.org/) çok iyi bir iş çıkarsa da bu işe yarar. – Phil

+1

@Phil Brown Go ... – austinbv

cevap

3

, sadece

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

göster ... vb

/** 
* @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; 
} 

Ve gibi modellik yapar mısın, kurulum ve işleme adil bir miktar var Ek yük dahil ancak alan modeliniz daha karmaşık hale geldikçe bir ORM'yi takdir edeceksiniz.

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

dediğin gibi $ sttClass bok sizin dizidir varsayarsak:: D

+0

okuma ve ana bilgisayarım kurulu değil ne de yüklemek için yeteneği var mı :( – austinbv

+0

@zobgib Gereksinimler PHP 5.3.İhtiyacınız varsa, bunu yükleyebilirsiniz – Phil

+0

Ah, Teşekkürler.Ben gerçekten farklı bir çözüm istiyorum Bunun için kısa bir süre için sadece bir başka yazılım parçasının öğrenilmesi her zaman bir acıdır. Eğer başka bir çözüm yoksa . – austinbv

0

Ben bu yardımı umuyoruz.

1

Bu yüzden bir süredir çalışıyorum ve kendi cevabımla geldim. Giriş yapmayı çok isterim çünkü muhtemelen bunun için BAD yolu olduğunu düşünüyorum.

İşte benim düşünce sürecim. Bir Sorgu harika ama ne olursa olsun sonuç dizisini aşamalı olarak geliştirirsek. Demek istediğim, sonuçlar dizisini SELECT ifadeleriyle tablolardan geçerek yapılandırabiliriz.

İşte benim yorum yaptığım kod, çünkü algoritmamı yalnızca sözcük olarak tanımlamakta zorlanıyorum.

/* $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; 

     } 
    } 
} 

yukarıdaki bu çözüm ile

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

Benim sorun olarak yorumlanabilir hangi

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

şöyle benim üst yorumunda demek budur görünüyor dizisi döndürür. Bu sonuçları, cevapta listelenen orijinal sonuçlara yönelik bir dizi aramasıyla çoğaltabileceğinizi düşünüyorum. Bu daha kötü görünüyor.

Lütfen hayatım boyunca lütfen bunun nasıl iyileştirileceğini söyleyin, bu bana yardımcı olacaktır.

Çok teşekkürler. Sağlanan bilgiler ve deyimler için

İlgili konular