如何在 Symfony2 中单向持久化一对一实体

Posted

技术标签:

【中文标题】如何在 Symfony2 中单向持久化一对一实体【英文标题】:How persist one to one entity unidirectionally in Symfony2 【发布时间】:2014-06-29 12:43:24 【问题描述】:

我在 Symfony2 中使用 Doctrine 的两个实体有问题:

这是第一个实体:

    /**
 * Pedidos
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="RestCarta\Bundle\FrontendBundle\Entity\PedidosRepository")
 */
class Pedidos

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="usuario", type="string", length=100)
     */
    private $usuario;

    /**
     * @var string
     *
     * @ORM\Column(name="mesa", type="string", length=3)
     */
    private $mesa;

    /**
     * @var integer
     *
     * @ORM\OneToOne(targetEntity="Articulos")
     * @ORM\JoinColumn(name="articulo_id", referencedColumnName="id")
     */
    private $articulo;

    /**
     * @var string
     *
     * @ORM\Column(name="precio", type="decimal")
     */
    private $precio;

这是第二个实体:

/**
 * Articulos
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="RestCarta\Bundle\FrontendBundle\Entity\ArticulosRepository")
 */
class Articulos

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="referencia", type="string", length=100)
     */
    private $referencia;

    /**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=255)
     */
    private $nombre;

    /**
     * @var string
     *
     * @ORM\Column(name="descripcion", type="string", length=255)
     */
    private $descripcion;

    /**
     * @var string
     *
     * @ORM\Column(name="precio", type="decimal")
     */
    private $precio;

    /**
     * @var string
     *
     * @ORM\Column(name="imagen", type="string", length=255)
     */
    private $imagen;

    /**
     * @ORM\ManyToOne(targetEntity="Categorias", inversedBy="articulos")
     * @ORM\JoinColumn(name="categoria_id", referencedColumnName="id")
     */
    protected $categoria;

现在问题来了。

我怎样才能坚持一个包含一个“Articulo”的“Pedido”??

我可以读取所有“Pedido”,并且带有“Articulo”的 LEFT JOIN 工作完美,(通过 phpMyAdmin 手动插入数据)但是当我使用此代码保留更多数据时:

$em = $this->getDoctrine()->getManager();


$pedido = new Pedidos();
        $pedido->setUsuario('blablabla');
        $pedido->setMesa('blablabla'); 
        $pedido->setArticulo($identi);
        $pedido->setPrecio('blablabla');

        $em->persist($pedido);
        $em->flush(); 

$identi = 对应“Articulos”的id

结果是:

警告:spl_object_hash() 期望参数 1 是对象,字符串 给出 /Applications/MAMP/htdocs/RestCarta/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php 第 1388 行 500 内部服务器错误 - ContextErrorException

拜托,有人可以帮助我吗?

提前致谢

【问题讨论】:

$identi 必须是实体对象,而不仅仅是你可以使用的ID$em->getReference('YourNamespace\Articulos', $identi); 谢谢鲁菲努斯!!!完美工作!!!请回答问题,而不是评论来批准答案。 【参考方案1】:

$identi必须是实体对象,不能只是你可以使用的ID

$em->getReference('YourNamespace\Articulos', $identi);

【讨论】:

以上是关于如何在 Symfony2 中单向持久化一对一实体的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 一对一关系

Symfony2/Doctrine:如何从实体类中持久化一个实体?

Symfony2 - 具有一对一关系的 Doctrine Save 实体

Mybatis表关联一对一

Symfony2:获取持久化对象的 id

Symfony2 映射一对多多音