有人可以帮助我用外行术语理解数据透视表吗?
Can someone help me understand pivot tables in layman terms?
我认为我的问题需要一个支点 table 但我想在花费大量时间尝试实施之前弄清楚。我还没有为任何项目使用 pivot tables。
我有一个新项目,其中包含多个 "kits",其中有共同的 "parts",在某些情况下,一个部件可以与另一个套件的部件互换。同样,并非所有部件都相互兼容。
与其创建一些噩梦般的 SQL 查询,我更希望构建一个 table 来存储兼容性信息以使交叉引用成为一个简单的 SQL 查询。
示例:
SELECT kitID FROM crossRefTable WHERE partA, partC and partE are true.
或者例如:
SELECT partID FROM crossRefTable WHERE partA and partE are true.
(是的,SQL 查询只是为了强调这一点)
我不确定“belongTo”和“hasMany”是否一定适用于此,或者如果适用,将如何实施?
编码在 PhalconPHP 中使用 MongoDB.
感谢您的想法和建议。
史蒂文
假设您有 23 个套件和 512 个不同的部件。您如何定义套件 1 使用部件 A、B 和 C,而套件 2 使用部件 A、D、E 和 F?枢轴 table 是定义每个套件及其部件之间关系的良好解决方案。一旦你有了一个 Kits table、一个 Parts table 和一个 KitParts table,你就可以将三者结合在一起以便于查询。一旦加入成为您的第二天性,与他们一起工作实际上是一种乐趣。
就 PhalconPHP 而言,hasMany
和 belongsTo
(note it has an s) 结合枢轴 table 是一个很好的解决方案。在枢轴 table 中,您将引用套件的 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";
}
您还可以将一种方法添加到您的套件中 class 让生活更轻松:
(同样,这是未经测试的...如果有问题请参考 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";
}
我认为我的问题需要一个支点 table 但我想在花费大量时间尝试实施之前弄清楚。我还没有为任何项目使用 pivot tables。
我有一个新项目,其中包含多个 "kits",其中有共同的 "parts",在某些情况下,一个部件可以与另一个套件的部件互换。同样,并非所有部件都相互兼容。
与其创建一些噩梦般的 SQL 查询,我更希望构建一个 table 来存储兼容性信息以使交叉引用成为一个简单的 SQL 查询。
示例:
SELECT kitID FROM crossRefTable WHERE partA, partC and partE are true.
或者例如:
SELECT partID FROM crossRefTable WHERE partA and partE are true.
(是的,SQL 查询只是为了强调这一点)
我不确定“belongTo”和“hasMany”是否一定适用于此,或者如果适用,将如何实施?
编码在 PhalconPHP 中使用 MongoDB.
感谢您的想法和建议。
史蒂文
假设您有 23 个套件和 512 个不同的部件。您如何定义套件 1 使用部件 A、B 和 C,而套件 2 使用部件 A、D、E 和 F?枢轴 table 是定义每个套件及其部件之间关系的良好解决方案。一旦你有了一个 Kits table、一个 Parts table 和一个 KitParts table,你就可以将三者结合在一起以便于查询。一旦加入成为您的第二天性,与他们一起工作实际上是一种乐趣。
就 PhalconPHP 而言,hasMany
和 belongsTo
(note it has an s) 结合枢轴 table 是一个很好的解决方案。在枢轴 table 中,您将引用套件的 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";
}
您还可以将一种方法添加到您的套件中 class 让生活更轻松: (同样,这是未经测试的...如果有问题请参考 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";
}