【问题标题】:Can someone help me understand pivot tables in layman terms?有人可以帮助我用外行的方式理解数据透视表吗?
【发布时间】:2016-06-22 03:34:44
【问题描述】:

我认为我的问题需要一个数据透视表,但我想在花费大量时间尝试实施之前先弄清楚。我还没有在任何项目中使用数据透视表。

我有一个新项目,其中包含多个“套件”,它们之间有共同的“部件”,在某些情况下,一个部件可以与另一个套件的部件互换。同样,并非所有部分都相互兼容。

与其创建一些噩梦般的 SQL 查询,我希望从本质上构建一个存储兼容性信息的表,以便交叉引用一个简单的 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 进行编码。

感谢您的想法和建议。

史蒂文

【问题讨论】:

  • 为什么投反对票?

标签: php mysql mongodb phalcon


【解决方案1】:

假设您有 23 个套件和 512 个不同的零件。您如何定义套件 1 使用 A、B 和 C 部分,而套件 2 使用 A、D、E 和 F 部分?数据透视表是定义每个套件及其部件之间关系的一个很好的解决方案。一旦你有一个 Kits 表、一个 Parts 表和一个 KitParts 表,你就可以将这三个表连接在一起以便于查询。一旦加入成为您的第二天性,与他们一起工作实际上是一种乐趣。

就 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";
}

您还可以在 Kits 类中添加一个方法来让生活更轻松: (同样,这是未经测试的......如果有问题,请参阅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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多