我是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 。
我想要的是将一个Name类型对象输入到Test中,将其作为字符串保存在数据库中。当我检索实体时,我希望name的类型为Name,而不是string。
我尝试在name属性的实体中使用 @ORM \ Column(type =&#34; string&#34;),这种方法很有效。但是,当Doctrine获取实体时,我得到一个字符串而不是Name类型。
我还尝试在值对象value属性中设置v * @ ORM \ Column(type =&#34; string&#34;,name =&#34; name&#34;)*,只是为了让Doctrine名称为字段为 name_name 而不是 name_value 。
手动创建数据库架构。 我正在使用Laravel和Doctrine使用mitchellvanw / laravel-doctrine。
答案 0 :(得分:6)
在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已更新,以反映此配置。