假设我想在我的数据库中有两个实体,一个Box和一个Object。我可以有不同的盒子,在每个盒子里我可以添加多个对象。 (为简单起见,我在代码示例中错过了getter,setter,$ id等)
框实体
namespace AppBundle\Entity;
class Box {
...
/**
* @ORM\OneToMany(targetEntity="Object", mappedby="box")
*/
private $objects;
}
对象实体
namespace AppBundle\Entity;
class Object {
...
/**
* @ORM\ManyToOne(targetEntity="Box", mappedby="objects")
*/
private $box;
// The following are assumptions
private $objectType;
private $objectData;
private $theObject;
}
我的对象可以是多种类型(我希望能够在不触及数据库的情况下添加新类型的对象):
笔(非实体)
class Pen implements ObjectType {
public $color; // In reality this would have set/get
public function whatAmI() {
return "I am a ".$this->color." pen";
}
}
远程(非实体)
class Remote implements ObjectType {
public $numberOfButtons;
public function whatAmI() {
return "I am a remote with ".$this->numberOfButtons." buttons";
}
public function pressButton() {
...
}
}
对象类型
interface ObjectType {
public function whatAmI();
}
我的问题是将两个位组合在一起的最佳方法是什么?我希望能够做到以下几点:
浏览我框中的所有对象并调用它们实现的功能:
$myBox = $em->find('Box', $id);
foreach ($myBox->getObjects() as $object) {
echo $object->whatAmI();
}
创建一个新对象并将其添加到我的框中:
$myPen = new Pen();
$myPen->color = "red";
$myBox->addObject($myPen);
如果我直接从数据库中获取对象,则调用函数:
$myRemote = find('Object', $id); // $id will be of a Remote class
$myRemote->pressButton();