2014-11-02 6 views
-1

클래스가 다른 객체를 보유하고있을 때 관계형 데이터베이스에서 데이터를 검색하고 객체에 매핑하는 것이 가장 좋습니다. (1 대 다수)PHP OOP 관계와 클래스 및 데이터베이스에서 검색

Doctrine과 같은 일부 ORM 프레임 워크가 있다는 것을 알고 있습니다. 그러나 나는 나 자신에 의한 매핑 방법을 배우려고 노력하고있다. enter image description here

내 클래스 (간체) : 내 경우

나는 세 개의 테이블 (DB)/클래스 (PHP)이

다음
class Tray { 

    private $tray_id; 
    private $name; 
    private $creation_date; 
    private $warehouse; 
    private $suborders= array(); 


    public function __construct($tray_id = null, $name, $warehouse,$suborders=null) { 
     $this->setId($tray_id); 
     $this->setName($name); 
     $this->setWarehouse($Warehouse); 
     $this->setSubOrders($suborders); 
    } 

    //Getters and Setters like: 
    public function getId() { 
     return $this->tray_id; 
    } 

    public function setId($tray_id) { 
     $this->tray_id = $tray_id; 
    } 
} 


class Stock { 

    private $stock_id; 
    ... 
    private $trays = array(); 



    public function __construct($x, $y, $id=null) { 
     $this->setX($x); 
     $this->setY($y); 
     $this->setId($id); 
    } 
//Getters and Setters 
} 

class Suborder { 

private $suborder_id; 
private $tray; 


public function __construct($suborder_id, $tray = null) { 
    $this->setId($suborder_id); 
    $this->setTray($tray); 
} 

... 
} 

내가 가진 몇 가지 ORM 도우미 클래스를 (안 그것을위한 올바른 설명이 있는지 알고 다른 사람들이 내 생각이 레포지토리 부를 것이다). 아목의 경우 : 트레이를 들어

class SuborderRepository 
{ 

protected $db; 

    public function __construct($db) 
    { 
     $this->db = $db; 
    } 

    public function findById($suborder_id) 
    { 

     try { 
      $stmt = $this->db->prepare('SELECT * FROM `Suborder` WHERE suborder_id = :suborder_id'); 
      $stmt ->execute(array('suborder_id' => $suborder_id)); 
      $result = $stmt->fetchAll(); 
      $suborder = null; 
      if(!empty($result)) { 
    //here I'm getting a tray Object mapped in the private tray; 
       $trayRepo = new TrayRepository($this->db); 
       $tray = $trayRepo->findById($result[0]['tray_id']); 
    //return suborder 
       $suborder = new Suborder($result[0]['suborder_id'], $tray); 
      } 
      return $suborder; 

     } catch (PDOException $ex) { 
      echo 'ERROR: ' . $ex->getMessage; 
     } 

    } 
//insert, update, delete ... 

s :

class TrayRepository 
{ 
    protected $db; 

    public function __construct($db) 
{ 
    $this->db = $db; 
} 

public function findById($tray_id) 
{ 
    try { 
     $stmt = $this->db->prepare('SELECT * FROM `Tray` WHERE tray_id = :tray_id'); 
     $stmt ->execute(array('tray_id' => $tray_id)); 
     $result = $stmt->fetchAll(); 
     $tray = null; 
     if(!empty($result)) { 
    //object for warehouse 
      $warehouseRepo = new warehouseRepository($this->db); 
      $warehouse = $stockRepo->findById($result[0]['stock_id']); 
    //tray object 
      $tray = new Tray($result[0]['tray_id'], $result[0]['name'], $warehouse); 
    // call method to set all suborders in tray object 
      $tray = $this->findAllSuborders($tray); 
     } 
     return $tray; 

    } catch (PDOException $ex) { 
     echo 'ERROR: ' . $ex->getMessage; 
    } 

} 

public function findAllSuborders($tray) { 
    try { 
     $stmt = $this->db->prepare('SELECT * FROM `Suborder` WHERE tray_id = :tray_id ORDER BY suborder_id'); 
     $stmt ->execute(array('tray_id' => $tray->getId())); 
     $result = $stmt->fetchAll(); 
     $suborders = array(); 

     foreach($result as $suborder) { 
      $suborders[] = new Suborder($suborder['suborder_id'], $tray); 
     } 
     $tray->setSuborders($suborders); 

     return $tray; 

    } catch (PDOException $ex) { 
     echo 'ERROR: ' . $ex->getMessage; 
    } 
} 

웨어 하우스의 경우 트레이와 거의 같습니다. 내 컨트롤러에서

내보기에 대한 트레이 또는웨어 하우스 객체를 생성하고 검색 데이터 저장소를 통해 :

$trayRepo = new TrayRepository($conn); 
$tray = $trayRepo->findById($tray_id)); 

하지만 난이 오류를 얻을 :

Fatal error: Maximum function nesting level of '100' reached, aborting!... pointed to repository 

그래서 나는 그것이 추측을 내가 만드는 모든 객체에 대해 거의 모든 재귀 적 데이터를 검색하는 좋은 방법이 아닙니다.

이를 피하기위한 해결책은 무엇입니까? $ tray-> getSuborders() 메서드가 호출 될 때까지 관련 객체를 검색하지 않을 수 있습니까? ORM 프레임 워크를 사용하는 경우를 제외하고는 무엇이 가장 좋은 방법일까요?

올바른 방향으로 나를 가리키면 좋을 것입니다.

+0

를 읽어 제안 ...이 문제를 재현 할 수있는 짧은 필요한 코드는 정말입니까? 명확하고 재현 가능한 문제가있는 질문은 더 많은 관심과 좋은 카르마를 얻는 경향이 있습니다. –

답변

0

난 당신이 많은 코드가있어이 프랑스어 기사 http://willdurand.fr/implementation-en-php-53-des-concepts-orm-dal-dao-crud/

+0

안녕하세요, 귀하의 회신에 감사드립니다. 프랑스어는 제 언어가 아닙니다. 그러나 Google 번역본이 어떤 언어인지 알 수 있습니다. D 자세한 질문이있는 경우 코드 예제를 확인하고 알려 드리겠습니다. – ChrisS

+4

안녕하세요 Shadar! 그들이 속해있는 * comment *에 링크 전용 답변을 올리거나이 프랑스어 기사가 도움이 될만한 이유를 정확하게 기재하십시오. 당신의 대답은 항상 그 자체로 서 있어야한다는 것을 기억하십시오 : 긴 기사를 클릭하거나 읽지 않고 질문에 대답 할 수 있습니까? –