의 당신이 23 개 키트와 512 개 독특한 부분이 있다고 가정 해 봅시다. 키트 2가 파트 A, D, E 및 F를 사용하는 반면 키트 1은 파트 A, B 및 C를 어떻게 사용한다고 정의합니까? 피봇 테이블은 각 키트와 부품 사이의 관계를 정의하는 데 적합한 솔루션입니다. 키트 테이블, 부품 테이블 및 KitParts 테이블이 있으면 쉽게 쿼리 할 수 있도록 세 파트를 조인 할 수 있습니다. 일단 조인이 당신에게 제 2의 천성이되면, 그들은 실제로 함께 일하는 즐거움입니다.
PhalconPHP의 관점에서 피벗 테이블과 결합 된 hasMany
및 belongsTo
(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";
}
을 왜 부결? – Steven