PHP Doctrine загрузка связанных объектов вызывает ошибку - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть два объекта с именами Osoba и Adresa.Оба они правильно сопоставлены с аннотациями доктрины.Osoba и Adresa находятся в ассоциации один к одному.

Я могу загрузить Osoba и Adresa отдельно с менеджером сущностей.Пока Особа не имеет имущества, населенного Адреса, он работает нормально.Но когда я сохраняю Osoba со свойством Adresa и пытаюсь извлечь объект из базы данных, выдается ошибка.

Вот как я пытаюсь получить объект Osoba.Особа с идентификатором 13 в базе данных содержит идентификатор, указывающий на таблицу Адреса.

$osoba = $entityManager->find("Osoba", 13);

И выдается ошибка:

Fatal error: require(): Failed opening required 'C:\Users\xxx\AppData\Local\Temp\__CG__Adresa.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\vendor\doctrine\common\lib\Doctrine\Common\Proxy\AbstractProxyFactory.php on line 206

Вот мои сущности Особа и Адреса.

<?php
declare(strict_types = 1);

require_once('Krajina.php');
require_once('Obec.php');
require_once ("BaseDAO.php");

use \Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity
 * @ORM\Table(name="mr_adresa")
 */
class Adresa extends BaseDAO
{

/**
 * @ORM\Column(type="string", name="orientacne_cislo")
*/
private $orientacneCislo;
/**
 * @ORM\Column(type="string")
 */
private $psc;
/**
 * @ORM\Column(type="string", name="supisne_cislo")
 */
private $supisneCislo;
/**
 * @ORM\Column(type="string")
 */
private $ulica;
/**
 * @ORM\OneToOne(targetEntity="Krajina")
 * @ORM\JoinColumn(name="krajina_id", referencedColumnName="id")
 */
private $m_Krajina;
/**
 * @ORM\OneToOne(targetEntity="Obec")
 * @ORM\JoinColumn(name="obec_id", referencedColumnName="id")
 */
private $m_Obec;

public function getOrientacneCislo(): string
{
    return $this->orientacneCislo;
}

public function setOrientacneCislo(string $orientacneCislo): void
{
    $this->orientacneCislo = $orientacneCislo;
}

public function getPsc(): string
{
    return $this->psc;
}

public function setPsc(string $psc): void
{
    $this->psc = $psc;
}

public function getSupisneCislo(): string
{
    return $this->supisneCislo;
}

public function setSupisneCislo(string $supisneCislo): void
{
    $this->supisneCislo = $supisneCislo;
}

public function getUlica(): string
{
    return $this->ulica;
}

public function setUlica(string $ulica): void
{
    $this->ulica = $ulica;
}

public function getMKrajina(): Krajina
{
    return $this->m_Krajina;
}

public function setMKrajina(Krajina $m_Krajina): void
{
    $this->m_Krajina = $m_Krajina;
}

public function getMObec(): Obec
{
    return $this->m_Obec;
}

public function setMObec(Obec $m_Obec): void
{
    $this->m_Obec = $m_Obec;
}

}

<?php
declare(strict_types = 1);

require_once('Krajina.php');
require_once('Pohlavie.php');
require_once('Adresa.php');
require_once ("BaseDAO.php");

use \Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="mr_osoba")
*/
class Osoba extends BaseDAO
{

    /**
     * @ORM\Column(type="date", name="datum_narodenia")
     */
    private $datumNarodenia;
    /**
     * @ORM\Column(type="string")
     */
    private $email;
    /**
     * @ORM\Column(type="string", name="iban_dotacia")
     */
    private $ibanDotacia;
    /**
     * @ORM\Column(type="string", name="iban_sponzor")
     */
    private $ibanSponzor;
    /**
     * @ORM\Column(type="string")
    */
    private $meno;
    /**
     * --@ORM\Column(type="datetime", name="platnost_ku_datumu")
     */
//  private $platnostKuDatumu;
    /**
     * @ORM\Column
     */
    private $priezvisko;
    /**
     * @ORM\Column(name="rodne_cislo")
     */
    private $rodneCislo;
    /**
     * @ORM\OneToOne(targetEntity="Krajina")
     * @ORM\JoinColumn(name="krajina_id", referencedColumnName="id")
     */
    private $m_Krajina;
    /**
     * @ORM\Column(name="pohlavie", type="string")
     */
    private $m_Pohlavie;
    /**
     * @ORM\OneToOne(targetEntity="Krajina")
     * @ORM\JoinColumn(name="statna_prislusnost_id", referencedColumnName="id")
     */
    private $m_StatnaPrislusnost;
    /**
     * @ORM\OneToOne(targetEntity="Adresa")
     * @ORM\JoinColumn(name="dorucovacia_adresa_id", referencedColumnName="id")
     */
    private $m_DorucovaciaAdresa;
    /**
     * @ORM\OneToOne(targetEntity="Adresa")
     * @ORM\JoinColumn(name="trvale_bydlisko_id", referencedColumnName="id")
     */
    private $m_TrvaleBydlisko;

    public function getDatumNarodenia()
    {
        return $this->datumNarodenia;
    }

    public function setDatumNarodenia($datumNarodenia): void
    {
        $this->datumNarodenia = $datumNarodenia;
    }

    public function getEmail(): string
    {
        return $this->email;
    }

    public function setEmail(string $email): void
    {
        $this->email = $email;
    }

    public function getIbanDotacia(): string
    {
        return $this->ibanDotacia;
    }

    public function setIbanDotacia(string $ibanDotacia): void
    {
        $this->ibanDotacia = $ibanDotacia;
    }

    public function getIbanSponzor(): string
    {
        return $this->ibanSponzor;
    }

    public function setIbanSponzor(string $ibanSponzor): void
    {
        $this->ibanSponzor = $ibanSponzor;
    }

    public function getMeno(): string
    {
        return $this->meno;
    }

    public function setMeno(string $meno)
    {
        $this->meno = $meno;
    }

    public function getPlatnostKuDatumu(): DateTime
    {
        return $this->platnostKuDatumu;
    }

    public function setPlatnostKuDatumu(DateTime $platnostKuDatumu): void
    {
        $this->platnostKuDatumu = $platnostKuDatumu;
    }

    public function getPriezvisko(): string
    {
        return $this->priezvisko;
    }

    public function setPriezvisko(string $priezvisko): void
    {
        $this->priezvisko = $priezvisko;
    }

    public function getRodneCislo(): string
    {
        return $this->rodneCislo;
    }

    public function setRodneCislo(string $rodneCislo): void
    {
        $this->rodneCislo = $rodneCislo;
    }

    public function getMKrajina(): Krajina
    {
        return $this->m_Krajina;
    }

    public function setMKrajina(Krajina $m_Krajina): void
    {
        $this->m_Krajina = $m_Krajina;
    }

    public function getMPohlavie(): Pohlavie
    {
        return $this->m_Pohlavie;
    }

    public function setMPohlavie(Pohlavie $m_Pohlavie): void
    {
        $this->m_Pohlavie = $m_Pohlavie;
    }

    public function getMStatnaPrislusnost(): Krajina
    {
        return $this->m_StatnaPrislusnost;
    }

    public function setMStatnaPrislusnost(Krajina $m_StatnaPrislusnost): void
    {
        $this->m_StatnaPrislusnost = $m_StatnaPrislusnost;
    }

    public function getMDorucovaciaAdresa(): Adresa
    {
        return $this->m_DorucovaciaAdresa;
    }

    public function setMDorucovaciaAdresa(Adresa $m_Adresa): void
    {
        $this->m_DorucovaciaAdresa = $m_Adresa;
    }

    public function getMTrvaleBydlisko(): Adresa
    {
        return $this->m_TrvaleBydlisko;
    }

    public function setMTrvaleBydlisko(Adresa $m_TrvaleBydlisko): void
    {
        $this->m_TrvaleBydlisko = $m_TrvaleBydlisko;
    }

}

1 Ответ

0 голосов
/ 05 апреля 2019

Хорошо, я выяснил, в чем проблема.

Doctrine подключается к базе данных через прокси-объект, который генерируется самой доктриной.При создании конфигурации для доктрины есть два варианта - либо вы устанавливаете для dev mode значение true, либо false.Когда для режима dev установлено значение false, прокси не генерируется каждый раз, только один раз.Поэтому вам нужно хотя бы один раз установить для режима dev значение true или сгенерировать классы самостоятельно, что объясняется в этом ответе: https://stackoverflow.com/a/20231349/1869111

...