是否可以将动态Join作为ArrayCollection?

时间:2015-02-02 22:42:02

标签: mysql symfony doctrine

我有以下架构:

# 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;
}

是否有(或多或少)高效的方法来实现这一目标?

0 个答案:

没有答案