【问题标题】:Doctrine prefixing embeddable可嵌入的学说前缀
【发布时间】:2014-08-26 09:56:07
【问题描述】:

我是 Doctrine 的新手,我正在尝试实现 Doctrine 2.5 中的新 Embeddables

简化代码:

<?php namespace Blah;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="test")
 */
class Test {

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @var integer
     */
    private $id;

    /**
     * @ORM\Embedded(class="Name")
     * @var Name
     */
    private $name;

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

    public function getId()
    {
        return $this->id;
    }

    /**
     * @return Name
     */
    public function getName()
    {
        return $this->name;
    }

}

/**
 * @ORM\Embeddable
 */
class Name {

    /**
     * @ORM\Column(type="string")
     */
    private $value;

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function __toString()
    {
        return $this->value;
    }

}

看到查询日志,Doctrine 正在尝试插入/获取奇怪地命名为 name_value 而不是 name 的列。

我想要的是在Test中输入一个Name类型的对象,作为字符串保存在数据库中。当我检索实体时,我希望名称的类型是名称,而不是字符串。

我尝试在 name 属性中的实体中使用 @ORM\Column(type="string"),它确实有效。但是当 Doctrine 获取实体时,我得到的不是 Name 类型,而是一个字符串。

我还尝试在值对象中设置 v*@ORM\Column(type="string", name="name")*,只是为了让 Doctrine 将该字段命名为 name_name而不是 name_value

数据库架构是手动创建的。 我正在使用 Mitchellvanw/laravel-doctrine 使用 Laravel 和 Doctrine。

【问题讨论】:

    标签: php laravel laravel-4 doctrine-orm doctrine


    【解决方案1】:

    Doctrine's mailing list 上发帖后(感谢 Marco Pivetta 指出负责的代码),我了解到 Doctrine 设计为可嵌入的前缀。

    要删除前缀,您必须设置 columnPrefix=false 并适当地命名您的值。

    生成的代码将是:

    <?php namespace Blah;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="test")
     */
    class Test {
    
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         * @var integer
         */
        private $id;
    
        /**
         * @ORM\Embedded(class="Name", columnPrefix=false)
         * @var Name
         */
        private $name;
    
        /**
         *
         * @param Name $name
         */
        public function __construct(Name $name)
        {
            $this->name = $name;
        }
    
        /**
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
    
        /**
         * @return Name
         */
        public function getName()
        {
            return $this->name;
        }
    
    }
    
    /**
     * @ORM\Embeddable
     */
    class Name {
    
        /**
         * @ORM\Column(type="string", name="name")
         */
        private $value;
    
        /**
         * @param string
         */
        public function __construct($value)
        {
            $this->value = $value;
        }
    
        /**
         * @return string
         */
        public function __toString()
        {
            return $this->value;
        }
    
    }
    

    更新:

    Doctrine 的 embeddables documentation 已更新以反映此配置。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多