首页 文章

symfony2 doctrine onetoone get

提问于
浏览
0

我上课 miejsce

namespace Miejsce\ObiektyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * Miejsce
 * @ORM\Entity
 * @ORM\Table(name="mMiejsce")
 */
class Miejsce
{

...

 /**
     * @var Lokalizacja $lokalizacja
     * @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja" , mappedBy="miejsce")
     * @ORM\JoinColumn(name="id", referencedColumnName="id")
     */
    protected $lokalizacja;

   /**
     * Get lokalizacja
     *
     * @return \Miejsce\LokalizacjaBundle\Entity\Lokalizacja
     */
    public function getLokalizacja()
    {
        return $this->lokalizacja;
    }

lokalizacja

namespace Miejsce\LokalizacjaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Miejsce\ObiektyBundle\Entity\Miejsce;

/**
 * @ORM\Entity
 *
 * @ORM\Table(name="mLokalizacja")
*
 */
class Lokalizacja {
   /**
     * @var Miejsce
     * @ORM\OneToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce", inversedBy="lokalizacja")
     * @ORM\JoinColumn(name="id", referencedColumnName="id")
     */
    protected $miejsce;

我尝试在控制器中获取对象:

$miejsce = $this->getDoctrine()
            ->getRepository('MiejsceObiektyBundle:Miejsce')
            ->find(1);

 var_dump($miejsce->getLokalizacja());

并且在数据库中没有= * @ORM \ JoinColumn(name =“id”,referencedColumnName =“id”)时为null我有mMiejsce.id = 1和mLokalizacja.id

那么为什么这不要连接这些元素呢?我想得到miejsce对象并提交lokalizacja - onetoone关系 - id = id

我做错了什么?

但当我推* @ORM \ JoinColumn(name =“id”,referencedColumnName =“id”)

我得到:

类Miejsce \ LokalizacjaBundle \ Entity \ Miejsce不存在500内部服务器错误 - ReflectionException

我现在有 :

好的,现在我有:

/**
 * Miejsce
 * @ORM\Entity
 * @ORM\Table(name="mMiejsce")
 */
class Miejsce
{

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

    /**
     * @var Lokalizacja $lokalizacja
     * @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja", mappedBy="miejsce" )
     * @ORM\JoinColumn(name="id", referencedColumnName="miejsce_id")
     */
    protected $lokalizacja;

class Lokalizacja {

    /**
     * Lokalizacja.id = Miejsce.id
     * @ORM\Column(type="integer")
     * @ORM\Id
     */
    protected $id;


    /**
     * @var Miejsce
     * @ORM\OneToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce", inversedBy="lokalizacja")
     * @ORM\JoinColumn(name="miejsce_id", referencedColumnName="id")
     */
    protected $miejsce;

    /**
     * @ORM\Column(type="integer")
     */
    protected $miejsce_id;

数据库更新工作正常

php app/console doctrine:schema:update --force 
Database schema updated successfully! "5" queries were executed

但仍然有:

Class Miejsce\LokalizacjaBundle\Entity\Miejsce does not exist
500 Internal Server Error - ReflectionException

它非常奇怪 - 为什么doctrine / symfony尝试在不同的捆绑上找到这个类? (实体在其他捆绑包上?也许这是问题?)

1 回答

  • -1

    根据Doctrine Association Mapping Documentation,您需要指定关系的映射方式(通过ID和对象 . )以下是文档中的示例:

    <?php
    /** @Entity **/
    class Customer
    {
        // ...
    
        /**
         * @OneToOne(targetEntity="Cart", mappedBy="customer")
         **/
        private $cart;
    
        // ...
    }
    
    /** @Entity **/
    class Cart
    {
        // ...
    
        /**
         * @OneToOne(targetEntity="Customer", inversedBy="cart")
         * @JoinColumn(name="customer_id", referencedColumnName="id")
         **/
        private $customer;
    
        // ...
    }
    

    对于您的问题,您应该创建一个引用ID并将其用于您的一个对象中的 JoinColumn . 不要忘记 inversedBymappedBy

    class Miejsce
    {
        // ...
    
        /**
         * @var Lokalizacja $lokalizacja
         * @ORM\OneToOne(targetEntity="Miejsce\LokalizacjaBundle\Entity\Lokalizacja", inversedBy="miejsce" )
         * @ORM\JoinColumn(name="lokalizacja_id", referencedColumnName="id")
         **/
        protected $lokalizacja;
    
        // ...
    }
    
    
    class Lokalizacja {
    
        // ...
    
        /**
         * @var Miejsce
         * @ORM\OneToOne(targetEntity="Miejsce\ObiektyBundle\Entity\Miejsce",mappedBy="lokalizacja")
         */
        protected $miejsce;
    
        // ...
    }
    

    以下是映射对象的setter / getter函数应该是什么样子 . 无论您尝试在 Lokalizacja 内创建新的 Miejsce ,还是在 Miejsce 内创建新的 Lokalizacja ,您都应该包含完整的命名空间

    public function setMiejsce(Miejsce\ObiektyBundle\Entity\Miejsce $miejsce)
    {
        $this->miejsce = $miejsce;
    }
    

相关问题