如何为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库