Как получить идентификатор объекта Doctrine2, не зная его имени

Я пытаюсь создать абстрактный метод getId в моем базовом классе Entity в Symfony2, используя Doctrine2 для базы данных, в которой первичные ключи названы непоследовательно в разных таблицах.

При проверке объектов сущностей я вижу, что есть частное свойство _identifier, которое содержит информацию, которую я пытаюсь получить, но я не уверен, как правильно получить к ней доступ.

Я предполагаю, что есть некоторая простая магия доктрины, похожая на:

public function getId()
{
    return $this->getIdentifier();
}

Но нигде на интертубах не нашел.


person Lord_Baine    schedule 25.05.2011    source источник
comment
Есть ли у вас способ нормализовать ваши идентификаторы, или это вне вашего контроля?   -  person Derek Stobbe    schedule 26.05.2011
comment
К сожалению, нет. Большинство таблиц имеют имена TablenameID, но некоторые — CmpTablenameID. Однако все они аннотированы через @orm:Id в соответствующем объекте.   -  person Lord_Baine    schedule 26.05.2011


Ответы (1)


Вы можете получить доступ к этой информации через EntityManager#getClassMetadata(). Пример будет выглядеть так:

// $em instanceof EntityManager
$meta = $em->getClassMetadata(get_class($entity));
$identifier = $meta->getSingleIdentifierFieldName();

Если у вашей сущности есть составной первичный ключ, вместо него нужно использовать $meta->getIdentifierFieldNames(). Конечно, при использовании этого метода вам потребуется доступ к экземпляру EntityManager, поэтому этот код обычно помещается в пользовательский репозиторий, а не в самом объекте.

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

person Derek Stobbe    schedule 26.05.2011
comment
Вы можете увидеть ветку в группе пользователей Doctrine, где я непреднамеренно нашел этот ответ из-за другой проблемы здесь. - person Derek Stobbe; 27.05.2011
comment
Есть ли способ получить доступ к этой информации из сущности, а не из репозитория? - person Lord_Baine; 27.05.2011
comment
Я полагаю, вы могли бы перейти в конструктор. Или, если у вас есть некоторый контроль над своими сущностями, реализуйте IdentifiedInterface или что-то в этом роде и верните его вручную. В этом нет ничего волшебного, поскольку сущности — это просто старые PHP-объекты. - person Derek Stobbe; 04.06.2011
comment
На самом деле это можно решить с помощью отражения в java. Так что я думаю, можно решить и путем отражения в php - person webyildirim; 03.09.2014