Доктрина 2 Отображение наследования Базовая таблица или представление не найдены - PullRequest
3 голосов
/ 09 марта 2019

Я пытаюсь смоделировать наследование, используя отображение Docrtrine, но получаю ошибку.

Я хочу отобразить простые отношения. UserEntity будет базовым объектом для других связанных с пользователем объектов, таких как GuestUserEntity, AdminEntity.

У меня есть следующее отображение для BaseUserEntity

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                   https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">

    <entity name="MngIt\User\Domain\BaseUserEntity"
            repository-class="MngIt\User\Infrastructure\UserEntityRepository"
            inheritance-type="SINGLE_TABLE"
            table="mng_users">

        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>

        <discriminator-column name="discriminator"/>
        <discriminator-map>
            <discriminator-mapping value="buyer" class="MngIt\Admin\Domain\AdminEntity"/>
        </discriminator-map>

        <field name="login" type="string" column="login"/>
        <field name="username" type="string" column="username"/>
        <field name="email" type="string" column="email"/>
        <field name="balance" type="string" column="balance"/>
        <field name="lang" type="string" column="lang"/>
        <field name="timeDifference" type="string" column="timedifference"/>

    </entity>
</doctrine-mapping>

Определен следующий класс сущностей

class BaseUserEntity extends \MngIt\Base\Domain\BaseEntity {

    protected $username;

    protected $login;

    protected $email;

    protected $balance;

    protected $timeDifference;

    /**
     * @return mixed
     */
    public function getUsername() {
        return $this->username;
    }
    // getters ...
}

Для AdminEntity у меня есть следующее отображение xml

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
                   https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">

    <entity name="MngIt\Buyer\Domain\BuyerEntity"
            repository-class="MngIt\Admin\Infrastructure\AdminEntityRepository">

    </entity>
</doctrine-mapping>

И класс определяется следующим образом

<?php

namespace MngIt\Buyer\Domain;

use MngIt\User\Domain\BaseUserEntity;

class AdminEntity extends BaseUserEntity {

}

Всякий раз, когда я пытаюсь запросить пользователей, я получаю следующую ошибку

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'mngit.AdminEntity' 

Что не так с моей конфигурацией?

1 Ответ

1 голос
/ 09 марта 2019

Прежде всего, я могу предположить, что класс BaseUserEntity - это просто базовая сущность, которая содержит общие свойства.В этом случае лучше сделать этот класс abtract

abstract class BaseUserEntity extends \MngIt\Base\Domain\BaseEntity {

Также я вижу, что вы определили собственный репозиторий для этой сущности

repository-class="MngIt\User\Infrastructure\UserEntityRepository", поскольку этоБазовая сущность, нет необходимости определять хранилище.

Также рассмотрите возможность очистки кэшей, если вы его настроили.

$config->setQueryCacheImpl(new \Doctrine\Common\Cache\ApcuCache());
$config->setResultCacheImpl(new \Doctrine\Common\Cache\ApcuCache());
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ApcuCache());

Чтобы очистить кеш, вы можете запустить команду

php app/console cache:clear

Или программно

$cacheDriver = $entityManager->getConfiguration()->getResultCacheImpl();
$deleted = $cacheDriver->deleteAll();

Надеюсь, что поможет

...