我有以下架构:
# table `image`
id | src
--------------
1 | image.jpg
# table `text`
id | text
-----------------
1 | Hello World!
# table `parameter`
id | module_id | module | identifier | value
----------------------------------
1 | 1 | image | PARAMETER_YX | 1234
2 | 1 | text | PARAMETER_XY | 4231
"图像"和"文字"是模块,可以有几个"参数" (一对多)。这些参数与模块实例id和名称存储在同一个表中。
我现在想在我的Symfony2应用程序中做这样的事情:
$image = $this
->getRepository('AcmeBundle:Image')
->find(1);
foreach($image->getParameter() as $parameter) {
echo $parameter->getIdentifier().': '.$parameter->getValue();
// output: PARAMETER_YX: 1234
}
如果你想知道我的想法: 我需要将参数值保持为全局,因此可以添加和访问新模块,而无需更新核心应用程序本身。
更新
请参阅此代码以获得更好的解释(尤其是Image :: $参数上方的伪注释):
<?php
namespace AcmeBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Image
*
* @ORM\Table(name="image")
* @ORM\Entity
*/
class Image
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="src", type="string", length=256, nullable=false)
*/
private $src;
/**
* This pseudo annoation should explain what I'm trying to do
*
* @ORM\OneToMany(targetEntity="Parameter")
* @ORM\Where({Image.id = Parameter.moduleId, Parameter.module = 'image'})
*/
private $parameter;
public function __construct () {
$this->parameter = new ArrayCollection();
}
}
/**
* Parameter
*
* @ORM\Table(name="parameter")
* @ORM\Entity
*/
class Parameter
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="module_id", type="integer", nullable=false)
*/
private $moduleId;
/**
* @var string
*
* @ORM\Column(name="component", type="string", length=256, nullable=false)
*/
private $module;
/**
* @var string
*
* @ORM\Column(name="identifier", type="string", length=256, nullable=true)
*/
private $identifier;
/**
* @var string
*
* @ORM\Column(name="value", type="text", nullable=true)
*/
private $value;
}
是否有(或多或少)高效的方法来实现这一目标?