0
votes

i have class 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;
    }

and 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;

i try get object in controller :

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

 var_dump($miejsce->getLokalizacja());

and have null when dont have = * @ORM\JoinColumn(name="id", referencedColumnName="id") in database i have mMiejsce.id = 1 and mLokalizacja.id

so why this dont connect this elements ? i want get miejsce object and have filed lokalizacja - onetoone relation - id=id

what i do wrong ?

but when i push * @ORM\JoinColumn(name="id", referencedColumnName="id")

i get :

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

now i have :

ok so now i have :

/**
 * 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;

and

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;

database update work ok

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

but still have :

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

its very strange - why doctrine / symfony try find this class on diffrent bundle ? (entities is on other bundles ? maybe this is problem ?)

1

1 Answers

-1
votes

According to the Doctrine Association Mapping Documentation, you need to specify how the relationships are mapped (via ID and objects.) Here's the example from the docs:

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

    // ...
}

For your problem, you should create a reference ID and use it for the JoinColumn in one of your objects. Don't forget about inversedBy and mappedBy!

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;

    // ...
}

Here's what your setter/getter functions should be looking like for your mapped objects. Anywhere you try to create a new Miejsce inside of Lokalizacja, and a new Lokalizacja inside of Miejsce, you should include the full namespace

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