doctrine2,从反面检索关联数据

时间:2017-12-13 22:39:12

标签: mysql doctrine-orm one-to-many many-to-one hydration

我有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)

2 个答案:

答案 0 :(得分:0)

如果DireccionUsuaro之间的双向映射正确,则需要在双方使用setter方法。

另一方面,当使用ArrayCollection时,更容易(也许是唯一的方法)是逐个添加元素。

因此,您可以将此方法添加到setDirecciones()类:

,而不是Usuario
public function addDireccion(Direccion $direccion) {
    $direccion->setIdUsuario($this);
    $this->direcciones->add($direccion);
}

希望有所帮助。

并且,最好将其命名为$usuariosetUsuario而不是setIdUsuario,因为您使用对象并且PHP不应该关注实际的数据库字段名称(将其命名为那样)。

答案 1 :(得分:0)

我解决了。

由于某种原因发生的情况是,PHP注释实际上并没有被引用,或者以不同的方式说它,它首先是在听XML注释,所以我将xml语句放在关系的反面( usuario)里面的标签

<one-to-many field="direcciones" target-entity="Direccion" mapped-by="idUsuario" />

并且它有效,现在我对咨询的数据结果进行了修改,因此我可以向前端发送更清晰/更清晰的对象。