doctrine2 , 从反面检索相关数据
doctrine2 , retrieve associated data from inverse side
我有 2 个实体。
简单的逻辑就是一个用户有多个收货地址,以后可以选择其中一个收货。
第一个实体,方向(地址)。
<?php
use Doctrine\ORM\Mapping as ORM;
/**
* Direccion
*
* @ORM\Table(name="direccion", indexes={@ORM\Index(name="id_usuario",
columns={"id_usuario"})})
* @ORM\Entity
*/
class Direccion
{
/**
* @var string
*
* @ORM\Column(name="Calle", type="string", length=100, nullable=false)
*/
private $calle;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \Usuario
*
* @ORM\ManyToOne(targetEntity="Usuario", inversedBy="direcciones", fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_usuario", referencedColumnName="id" )
* })
*/
private $idUsuario;
/**
* Set calle
*
* @param string $calle
* @return Direccion
*/
public function setCalle($calle)
{
$this->calle = $calle;
return $this;
}
/**
* Get calle
*
* @return string
*/
public function getCalle()
{
return $this->calle;
}
/**
* Set idUsuario
*
* @param \Usuario $idUsuario
* @return Direccion
*/
public function setIdUsuario(\Usuario $idUsuario = null)
{
$this->idUsuario = $idUsuario;
return $this;
}
/**
* Get idUsuario
*
* @return \Usuario
*/
public function getIdUsuario()
{
return $this->idUsuario;
}
}
第二个实体是 Usuario(用户)
<?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;
}
}
我已经阅读了很多博客和类似的问题,但是当我尝试在关系的反面实现时,我无法得到 属性 $direcciones 水化或填充相关数据(OneToMany),使用 $usuario->getDirecciones();
我在非 MVC 架构中使用此代码,到目前为止,通过使用 Doctrine 语句的 DAO 创建和更新一切都像魅力一样,所以我知道在终点(更新,创建,持久化和刷新,使用 find,findBy 等检索数据),一切正常。
当我尝试填充从我同时使用 类(Usuario-InverseSide 和 Direccion-OwnerSide)的服务层调用的 ArrayCollection 时,没有任何反应,Usuario 上的 $direcciones arrayCollection 属性例如,即使我尝试在注释上建立 fetch="EAGER",也不会获取任何内容。
对于其余的数据或属性,一切正常,用户的所有其他属性都可以正常填充。
出于某种原因,注释没有被考虑,不知道为什么。
我花了几天时间试图找出如何完成这种访问关联数据的方式,不想使用 DQL,但在这一点上我想我会走那条路。
我尝试了一些硬编码来测试,结果是一样的,$direcciones 没有得到他的 data.Obvious 已经被丢弃,Usuario(用户)的确切 ID 有他的相关 direcciones (地址)已设置。
$usuario = $this->usuarioDAO->find(20);
$direcciones = $usuario->getDirecciones();
var_dump($direcciones);
return $usuario;
关系仅在 mysql InnoDb table.
的方向上用名为 id_usuario 的 FK 定义
不知道我是否应该在 Usuario 上设置其他东西 table。
或者如果我在我的项目中存储实体的方式有问题。
请帮助我,任何建议将不胜感激。
doctrine 2, hwo do get data from the inverse side (many to one)
前提是你的Direccion
和Usuaro
的双向映射是正确的,两边都需要使用setter方法。
还有一点,当使用 ArrayCollection
时,一个更简单(也许是唯一)的方法是逐个添加元素。
因此,您将此方法添加到 Usuario
而不是 setDirecciones()
class:
public function addDireccion(Direccion $direccion) {
$direccion->setIdUsuario($this);
$this->direcciones->add($direccion);
}
希望对您有所帮助。
而且,最好将其命名为 $usuario
和 setUsuario
而不是 od setIdUsuario
因为您使用对象并且 PHP 不应该关心实际的数据库字段名称(这样说)。
我解决了。
碰巧由于某种原因,php 注释没有被实际阅读,或者换一种说法,它先听了 XML 注释,所以我把xml 标签内关系(usuario)反面的句子
<one-to-many field="direcciones" target-entity="Direccion" mapped-by="idUsuario" />
它成功了,现在我完善了咨询的数据结果,所以我可以向前端发送一个 cleaner/clearer 对象。
我有 2 个实体。
简单的逻辑就是一个用户有多个收货地址,以后可以选择其中一个收货。
第一个实体,方向(地址)。
<?php
use Doctrine\ORM\Mapping as ORM;
/**
* Direccion
*
* @ORM\Table(name="direccion", indexes={@ORM\Index(name="id_usuario",
columns={"id_usuario"})})
* @ORM\Entity
*/
class Direccion
{
/**
* @var string
*
* @ORM\Column(name="Calle", type="string", length=100, nullable=false)
*/
private $calle;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \Usuario
*
* @ORM\ManyToOne(targetEntity="Usuario", inversedBy="direcciones", fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_usuario", referencedColumnName="id" )
* })
*/
private $idUsuario;
/**
* Set calle
*
* @param string $calle
* @return Direccion
*/
public function setCalle($calle)
{
$this->calle = $calle;
return $this;
}
/**
* Get calle
*
* @return string
*/
public function getCalle()
{
return $this->calle;
}
/**
* Set idUsuario
*
* @param \Usuario $idUsuario
* @return Direccion
*/
public function setIdUsuario(\Usuario $idUsuario = null)
{
$this->idUsuario = $idUsuario;
return $this;
}
/**
* Get idUsuario
*
* @return \Usuario
*/
public function getIdUsuario()
{
return $this->idUsuario;
}
}
第二个实体是 Usuario(用户)
<?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;
}
}
我已经阅读了很多博客和类似的问题,但是当我尝试在关系的反面实现时,我无法得到 属性 $direcciones 水化或填充相关数据(OneToMany),使用 $usuario->getDirecciones();
我在非 MVC 架构中使用此代码,到目前为止,通过使用 Doctrine 语句的 DAO 创建和更新一切都像魅力一样,所以我知道在终点(更新,创建,持久化和刷新,使用 find,findBy 等检索数据),一切正常。
当我尝试填充从我同时使用 类(Usuario-InverseSide 和 Direccion-OwnerSide)的服务层调用的 ArrayCollection 时,没有任何反应,Usuario 上的 $direcciones arrayCollection 属性例如,即使我尝试在注释上建立 fetch="EAGER",也不会获取任何内容。
对于其余的数据或属性,一切正常,用户的所有其他属性都可以正常填充。
出于某种原因,注释没有被考虑,不知道为什么。 我花了几天时间试图找出如何完成这种访问关联数据的方式,不想使用 DQL,但在这一点上我想我会走那条路。
我尝试了一些硬编码来测试,结果是一样的,$direcciones 没有得到他的 data.Obvious 已经被丢弃,Usuario(用户)的确切 ID 有他的相关 direcciones (地址)已设置。
$usuario = $this->usuarioDAO->find(20);
$direcciones = $usuario->getDirecciones();
var_dump($direcciones);
return $usuario;
关系仅在 mysql InnoDb table.
的方向上用名为 id_usuario 的 FK 定义不知道我是否应该在 Usuario 上设置其他东西 table。 或者如果我在我的项目中存储实体的方式有问题。
请帮助我,任何建议将不胜感激。
doctrine 2, hwo do get data from the inverse side (many to one)
前提是你的Direccion
和Usuaro
的双向映射是正确的,两边都需要使用setter方法。
还有一点,当使用 ArrayCollection
时,一个更简单(也许是唯一)的方法是逐个添加元素。
因此,您将此方法添加到 Usuario
而不是 setDirecciones()
class:
public function addDireccion(Direccion $direccion) {
$direccion->setIdUsuario($this);
$this->direcciones->add($direccion);
}
希望对您有所帮助。
而且,最好将其命名为 $usuario
和 setUsuario
而不是 od setIdUsuario
因为您使用对象并且 PHP 不应该关心实际的数据库字段名称(这样说)。
我解决了。
碰巧由于某种原因,php 注释没有被实际阅读,或者换一种说法,它先听了 XML 注释,所以我把xml 标签内关系(usuario)反面的句子
<one-to-many field="direcciones" target-entity="Direccion" mapped-by="idUsuario" />
它成功了,现在我完善了咨询的数据结果,所以我可以向前端发送一个 cleaner/clearer 对象。