mysql doctrine2,从反向侧检索关联数据

eqoofvh9  于 2023-04-29  发布在  Mysql
关注(0)|答案(2)|浏览(79)

我有两个实体。简单的逻辑是,用户有许多交付地址,因此将来他们将能够选择其中一个进行交付。
第一实体,Direccion(地址)。

<?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;
    }


}

我已经读过许多博客和类似的问题,但是当我试图在关系的反面(OneToMany)上实现时,我无法得到属性$directciones水合或填充相关数据,使用$usuario-〉getDirectciones();
我在一个非MVC架构中使用这段代码,到目前为止,一切都很顺利,通过使用Doctrine语句的DAO创建和更新,所以我知道在结束点(更新,创建,持久化和刷新,用find,findBy等检索数据)。),一切都很好。
当我尝试从服务层填充ArrayCollection调用时,我使用了两个类(Usuario-InverseSide和Direcion-OwnerSide),什么都没有发生,Usuario示例上的$direcciones arrayCollection属性没有获取任何东西,即使我尝试在注解上建立fetch=“EAGER“。
对于其余的数据或属性,一切都很好,用户的所有其他属性都得到了很好的填充。
出于某种原因,注解没有被考虑,不知道为什么。我花了几天时间试图弄清楚如何实现这种访问关联数据的方式,我不想使用DQL,但在这一点上,我想我会走这条路。
我尝试了一些硬编码来测试,结果是一样的,$direciones没有得到他的数据。显然已经被丢弃,Usuario(用户)的确切ID已经设置了他的相关地址。

$usuario = $this->usuarioDAO->find(20);
        $direcciones = $usuario->getDirecciones();
        var_dump($direcciones);
        return $usuario;

该关系仅在MySQL InnoDb表上的Direcion上用名为id_usuario的FK定义。
我不知道我是不是该在尤瑟里的table上放点别的东西。或者我在项目中存储实体的方式是否有问题。
请帮助我,任何推荐将不胜感激。
doctrine 2, how do get data from the inverse side (many to one)

lrpiutwd

lrpiutwd1#

假设DireccionUsuaro之间的双向Map是正确的,则需要在两端使用setter方法。
另一件事,当使用ArrayCollection时,一个更简单的方法(也许是唯一的方法)是一个接一个地添加元素。
因此,将此方法添加到Usuario类中,而不是setDirecciones()

public function addDireccion(Direccion $direccion) {
    $direccion->setIdUsuario($this);
    $this->direcciones->add($direccion);
}

希望能帮上忙。
而且,最好将其命名为$usuariosetUsuario,而不是od setIdUsuario,因为您使用的是对象,PHP不应该关心实际的数据库字段名称(这样说)。

cgfeq70w

cgfeq70w2#

解决了。
由于某种原因,php注解实际上并没有被读取,或者换一种说法,它首先监听XML注解,所以我将XML语句放在标记内关系的相反一侧(usuario

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

它工作了,现在我得到了抛光咨询的数据结果,这样我就可以发送一个更干净/更清晰的对象到前端。

相关问题