2016-06-22 2 views
-1

필자의 문제는 피벗 테이블을 필요로한다고 생각하지만 구현하려고하는 엄청난 시간을 소비하기 전에 분명히 알고 싶습니다. 아직 어떤 프로젝트에도 피벗 테이블을 사용하지 않았습니다.누군가 나를 평신도 용어로 피벗 테이블을 이해하도록 도와 줄 수 있습니까?

나는 공통 "부품"이있는 여러 "키트"를 포함하는 새 프로젝트가 있으며 경우에 따라 일부는 다른 키트의 부품과 상호 교환 될 수 있습니다. 마찬가지로 모든 부품이 서로 호환되는 것은 아닙니다.

악몽 같은 SQL 쿼리를 작성하는 대신, 간단한 SQL 쿼리를 상호 참조하기 위해 호환성 정보를 저장하는 테이블을 빌드하고 싶습니다.

예 :

SELECT kitID FROM crossRefTable WHERE partA, partC and partE are true. 

또는 예를 들어 :

SELECT partID FROM crossRefTable WHERE partA and partE are true. 

(예, SQL 쿼리는 부여 됨으로써 점만 강조를 위해)

을 나는 확실하지 않다 "belongsTo"및 "hasMany "이 반드시 여기에 적용됩니다. 그렇다면 어떻게 구현 될까요?

코딩은 MongoDB를를 사용 에 PhalconPHP입니다.

의견 및 제안에 감사드립니다.

스티븐

+0

을 왜 부결? – Steven

답변

0

의 당신이 23 개 키트와 512 개 독특한 부분이 있다고 가정 해 봅시다. 키트 2가 파트 A, D, E 및 F를 사용하는 반면 키트 1은 파트 A, B 및 C를 어떻게 사용한다고 정의합니까? 피봇 테이블은 각 키트와 부품 사이의 관계를 정의하는 데 적합한 솔루션입니다. 키트 테이블, 부품 테이블 및 KitParts 테이블이 있으면 쉽게 쿼리 할 수 ​​있도록 세 파트를 조인 할 수 있습니다. 일단 조인이 당신에게 제 2의 천성이되면, 그들은 실제로 함께 일하는 즐거움입니다.

PhalconPHP의 관점에서 피벗 테이블과 결합 된 hasManybelongsTo (note it has an s)은 훌륭한 솔루션입니다. 피봇 테이블에서 키트의 ID와 부품의 ID를 참조하십시오.

사용자가 현재 모든 키트 목록을보고 있으며 특정 키트를 클릭한다고 가정 해 봅시다. 이제는 모든 부품이 포함 된 것을 표시하려고합니다. 귀하의 예는 Phalcon manual shows과 거의 똑같은 상황입니다. 하지만 개인적으로 써서 방법의 측면에서 좀 더 다음과 같은 경로를 취할 것 :

(참고 :이 모든 안된 내가 몇 달 phalcon을 손도 안)

//Use your BaseModel to take some of the weight off your Models. 
//Nobody likes dirty Models, just ask Victoria's Secret. :p 
//BaseModels are a good place to add your own methods, 
//that way all models have access to them. 
class BaseModel extends \Phalcon\Mvc\Model 
{ 
} 

class Kits extends Basemodel 
{ 
    public $id; 
    public $name; 
    public function initialize() 
    { 
     $this->hasMany('id', 'KitParts', 'kit_id', array(
     'foreignKey' => array(
     'message' => 'Kit cannot be deleted because it\'s used by KitParts' 
     ) 
     )); 
    } 
} 

//Pivot table 
class KitParts extends BaseModel 
{ 
    public $id; 
    public $kit_id; //primary key used in Kits.id 
    public $part_id; //primary key used in Parts.id 
    $this->belongsTo('kit_id', 'Kits', 'id'); 
    $this->belongsTo('part_id', 'Parts', 'id'); 
} 

class Parts extends BaseModel 
{ 
    public $id; 
    public $name; 
    public function initialize() 
    { 
     $this->hasMany('id', 'KitParts', 'part_id', array(
     'foreignKey' => array(
     'message' => 'Part cannot be deleted because it\'s used by KitParts' 
     ) 
     )); 
    } 
} 

그런 다음 특정 키트에 대한 모든 부분을 표시하기 위해, 당신은 쓸 것 :

$kit = Kits::findFirst(123);//Find record with id = 123 
foreach ($kit->kitParts as $kitPart) 
{ 
    echo htmlentities($kitPart->parts->name), "<br>\n"; 
} 

또한 인생을 더 쉽게 확인하기 위해 키트 클래스에 메서드를 추가 할 수 있습니다 (다시 말하지만,이 안된 ... if documentation을 참조하십시오. 뭔가 잘못되었다.)

//Add this as a method to the "Kits" class 
public function getParts() 
{ 
    $results = array(); 
    foreach ($this->kitParts as $kitPart) 
    { 
     $results[] = $kitPart->parts; 
    } 
    return $results; 
} 

그럼 당신이 할 것 :

$kit = Kits::findFirst(123);//Find record with id = 123 
$parts = $kit->getParts(); 
if(count($parts) > 0) 
{ 
    echo "<strong>Parts</strong><br>\n"; 
    foreach($parts as $part) 
    { 
     echo htmlentities($part->name),"<br>\n"; 
    } 
}else{ 
    echo "No parts to show.<br>\n"; 
}