我有2个实体。
简单的逻辑是用户拥有许多送货地址,因此将来他可以选择其中一个送货地址。
第一个实体,Direccion(地址)。
<?php
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Usuario
*
* @ORM\Table(name="usuario")
* @ORM\Entity
*/
class Usuario
{
/**
* @var string
*
* @ORM\Column(name="nombre", type="string", length=255, nullable=true)
*/
private $nombre;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Direccion", mappedBy="id_usuario", cascade={"persist"})
*/
private $direcciones;
public function __construct()
{
$this->direcciones = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Set nombre
*
* @param string $nombre
* @return Usuario
*/
public function setNombre($nombre)
{
$this->nombre = $nombre;
return $this;
}
/**
* Get nombre
*
* @return string
*/
public function getNombre()
{
return $this->nombre;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
public function getDirecciones()
{
return $this->direcciones;
}
public function setDirecciones($direcciones)
{
$this->direcciones = $direcciones;
return $this;
}
}
,第二个实体是Usuario(用户)
$usuario = $this->usuarioDAO->find(20);
$direcciones = $usuario->getDirecciones();
var_dump($direcciones);
return $usuario;
我已经阅读了许多博客和类似的问题,但我无法获得财产$ direcciones水合或填充相关数据,当我尝试在关系的反面(OneToMany),与$ usuario-&GT; getDirecciones();
我正在使用非MVC架构中的代码,到目前为止,一切都像通过使用Doctrine句子的DAO创建和更新的魅力一样,所以我知道在结束点(更新,创建) ,持久化和刷新,使用find,findBy等检索数据,一切正常。
当我尝试从服务层填充ArrayCollection调用时我使用这两个类(Usuario-InverseSide和Direccion-OwnerSide),没有任何反应,Usuario实例上的$ direcciones arrayCollection属性不会获取任何内容,即使我尝试在注释上建立fetch =“EAGER”。
对于其余的数据或属性,一切正常,用户的所有其他属性都可以正常填充。
出于某种原因,注释没有被考虑,不知道为什么。 我花了几天时间试图弄清楚如何通过这种方式访问相关数据,不想使用DQL,但此时我想我会采取这条道路。
我尝试了硬编码的东西来测试,结果是一样的,$ direcciones没有得到他的数据。显然已经放弃了,Usuario(用户)的确切ID已经设置了他的相关指令(地址)
{{1}}
该关系仅在mysql InnoDb表上的Direccion上使用名为id_usuario的FK定义。
不知道我是否应该在Usuario表上设置其他内容。 或者如果我在项目中存储实体的方式有问题。
请帮助我,任何建议都将不胜感激。
doctrine 2, hwo do get data from the inverse side (many to one)
答案 0 :(得分:0)
如果Direccion
和Usuaro
之间的双向映射正确,则需要在双方使用setter方法。
另一方面,当使用ArrayCollection
时,更容易(也许是唯一的方法)是逐个添加元素。
因此,您可以将此方法添加到setDirecciones()
类:
Usuario
public function addDireccion(Direccion $direccion) {
$direccion->setIdUsuario($this);
$this->direcciones->add($direccion);
}
希望有所帮助。
并且,最好将其命名为$usuario
和setUsuario
而不是setIdUsuario
,因为您使用对象并且PHP不应该关注实际的数据库字段名称(将其命名为那样)。
答案 1 :(得分:0)
我解决了。
由于某种原因发生的情况是,PHP注释实际上并没有被引用,或者以不同的方式说它,它首先是在听XML注释,所以我将xml语句放在关系的反面( usuario)里面的标签
<one-to-many field="direcciones" target-entity="Direccion" mapped-by="idUsuario" />
并且它有效,现在我对咨询的数据结果进行了修改,因此我可以向前端发送更清晰/更清晰的对象。