클래스가 다른 객체를 보유하고있을 때 관계형 데이터베이스에서 데이터를 검색하고 객체에 매핑하는 것이 가장 좋습니다. (1 대 다수)PHP OOP 관계와 클래스 및 데이터베이스에서 검색
Doctrine과 같은 일부 ORM 프레임 워크가 있다는 것을 알고 있습니다. 그러나 나는 나 자신에 의한 매핑 방법을 배우려고 노력하고있다.
내 클래스 (간체) : 내 경우
나는 세 개의 테이블 (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 프레임 워크를 사용하는 경우를 제외하고는 무엇이 가장 좋은 방법일까요?
올바른 방향으로 나를 가리키면 좋을 것입니다.
를 읽어 제안 ...이 문제를 재현 할 수있는 짧은 필요한 코드는 정말입니까? 명확하고 재현 가능한 문제가있는 질문은 더 많은 관심과 좋은 카르마를 얻는 경향이 있습니다. –