Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为PHP多对多关系建模_Php_Model_Many To Many - Fatal编程技术网

如何为PHP多对多关系建模

如何为PHP多对多关系建模,php,model,many-to-many,Php,Model,Many To Many,我需要为我们的一个客户建立一个项目系统。 项目系统具有以下(给定)数据库结构: | item +-------------------------- | id tinyint(4) primary key | name varchar(30) | attr +-------------------------- | id tinyint(4) primary key | name varchar(30) | itemAttr +-------------------------- | ite

我需要为我们的一个客户建立一个项目系统。 项目系统具有以下(给定)数据库结构:

| item
+--------------------------
| id tinyint(4) primary key
| name varchar(30)

| attr
+--------------------------
| id tinyint(4) primary key
| name varchar(30)

| itemAttr
+--------------------------
| itemId foreign key
| attrid foreign key
| value varchar(255)
<?php

abstract class Item {
    private $id;

    private $name;  
}

class ShopItem extends Item {
    private $itemType;

    private $price;

    private $imageHref;

    private $description;   
}
我得到了班级结构:

| item
+--------------------------
| id tinyint(4) primary key
| name varchar(30)

| attr
+--------------------------
| id tinyint(4) primary key
| name varchar(30)

| itemAttr
+--------------------------
| itemId foreign key
| attrid foreign key
| value varchar(255)
<?php

abstract class Item {
    private $id;

    private $name;  
}

class ShopItem extends Item {
    private $itemType;

    private $price;

    private $imageHref;

    private $description;   
}
我有不同的搜索条件:

该项需要具有以下属性: ItemType(属性ID 1) 描述(属性2) 价格(属性3)

否则,我不想从数据库中取出此项,一个选项(通常有几个选项)是将它们存储在映射中,并通过通用getter(使用属性名称作为第一个参数)访问这些属性,或者使用魔术函数访问它们

<?php
abstract class Item {
    private $id;

    private $name;

    protected $attributes = array();

    /**
     * @param $name The attribute key/name
     * @return null|mixed returns NULL if the attribute was not set
     */
    public function getAttribute( $name ) {
        if( isset( $this->attributes[$name] ) ) {
            return $this->attributes[$name];
        }
        else {
            return null;
        }
    }
}

我个人会将属性数组作为成员添加到Item类中。最佳实践可在此处找到:

在数据库理论中,您需要该透视表遵循规范化原则,其中禁止嵌套关系。但在Php中,类之间并没有这种要求。

基本类关系:

class Item
{
    private $id;
    private $name;

    public $attrs = array();

    public function addAttr(Attr &$attr) { $this->attrs[] = $attr; $attr->items[] = $this; }
    public function getAttrs() { return $this->attrs; }

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

class Attr
{
    private $id;
    private $name;

    public $items = array();

    public function addItem(Item &$item) { $this->items[] = $item; $item->attrs[] = $attr; }
    public function getItems() { return $this->items; }

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

$item1 = new Item(1, "I1");
$item2 = new Item(2, "I2");

$attr1 = new Attr(1, "A1");
$attr2 = new Attr(2, "A2");

$item1->addAttr($attr1);
$item1->addAttr($attr2);

var_dump($item1->getAttrs());
var_dump($attr1->getItems());
我建议使用ORM库