2015-09-21 3 views
2

Мы переносим приложение на Symfony2 и в настоящее время застреваем с помощью доктрины ORM. У нас в базе есть множество плохих внешних ключей, и все сложнее делать сопоставления отношений без исключения в исключении «Сущность не найден». Это на дорожной карте, чтобы очистить базу данных, но сейчас это не то, что мы можем решить. Есть ли способ, чтобы я мог просто вернуть значение null, если он не смог найти правильную сущность?Игнорировать недостающие объекты в доктрине

Если у меня есть следующее отображение отношений:

User: 
     type: entity 
     table: user 
     id: 
     userID: 
      type: integer 
      generator: 
      strategy: NONE 
     fields: 
     contactName: 
      type: string 
      length: 255 
      nullable: false 
     contactPhone: 
      type: string 
      length: 255 
      nullable: false 
     companyName: 
      type: string 
      length: 255 
      nullable: false 
     username: 
      type: string 
      length: 255 
      nullable: false 
     password: 
      type: string 
      length: 255 
      nullable: false 
     email: 
      type: string 
      length: 255 
      nullable: false 
     manyToOne: 
      address: 
      targetEntity: Address 
      joinColumn: 
       name: addressID 
       referencedColumnName: addressID 
       nullable: true 
       default: null 



    ----------------------------------------------------- 

    Address: 
     type: entity 
     table: address 
     id: 
     addressID: 
      type: integer 
      generator: 
      strategy: AUTO 
     fields: 
     street: 
      type: string 
      length: 255 
      nullable: false 
     street2: 
      type: string 
      length: 255 
      nullable: false 
     city: 
      type: string 
      length: 255 
      nullable: false 
     state: 
      type: string 
      length: 32 
      nullable: false 
     zip: 
      type: string 
      length: 10 
      nullable: false 
     country: 
      type: string 
      length: 40 
      nullable: false 

Это кажется, что если есть плохое значение для AddressID в таблице пользователей я буду получить «Entity не был найден.» исключение при отправке через сериализатор.

ответ

0

Да, это вполне возможно, но мне сложно рассказать вам, как именно это сделать, потому что вы не представили никаких примеров. Можете ли вы привести некоторые существующие примеры кода, чтобы я мог дать вам совет по ним?

Btw вы делаете запросы в хранилищах, как это:

$qb = $this->entityManager->createQueryBuilder(); 
$qb->select('e') 
    ->from('MyBundle:Entity', 'e') 
    ->where($qb->expr()->eq('e.id', ':id')) 
    ->setParameter('id', 1) 
    ->setMaxResults(1); 

$result = $qb->getQuery()->getOneOrNullResult(); 

Тогда результат будет содержать нулевое значение, если объект не найден. Но я думаю, что в основном методы find * возвращают значение null. Проверьте класс репозитория на Doctrine2. Если вам нужно, вы также можете расширить репозиторий Doctrine и переопределить методы в случае, если что-то генерирует исключение. Вы можете поймать его и вернуть пустые массивы, пустые массивы или любые созданные вручную объекты ... и т. Д.

Если вы делаете какие-либо соединения, подумайте также об использовании левого соединения, если вы не уверены, что данные будут там. Также при обращении ссылочных объектов в коде, например, если у вас есть:

$user->getProfile(); 

И есть опасность, что он может вернуться нулю, проверьте в самом методе перед возвращением объекта, что-то вроде этого:

public function getProfile() 
{ 
    if ($this->profile === null) { 
     return new DummyProfile(); 
    } 

    return $this->profile; 
} 

Где DummyProfile может расширить исходный объект Profile и может быть как макет объекта, возвращая некоторые значения по умолчанию. Вы также можете сохранить этот фиктивный объект в свойстве и вернуть его в следующий раз, поэтому он не создается все время (шаблон singleton). Вот как вы можете защитить свой код, поэтому вы не вызываете методы вызова на null, что приведет к ошибке php.

Надежда, что дает представление о том, как продолжить ... :)

+0

благодарит за быстрый ответ! к сожалению, ваше предложение проверить значение null перед возвратом значения свойства не получилось. Я все еще получаю «Сущность не найдена». исключение. – Matt

+0

Извините, это плохое предложение - причина, по которой Entity не найдена, сводится к Doctrine/Symfony, загружающей сущность из модели, сначала проверка на null сначала не остановит это, тем более что ее ключ не null, что вызывает Symfony/Doctrine, чтобы попытаться загрузить его! –

0

Ах, это PITA, что мы видим довольно часто тоже. Если вы потеряли ленивую загрузку, тогда Doctrine может загружать &, унаследовав все связанные объекты в то время. Но я предполагаю, что он включен, и он умирает, когда вы пытаетесь сделать шаблон/форму в Symfony.

С Lazy Загрузка, вы не получите ошибку при загрузке объекта, однако вы получите сообщение об ошибке, если затем попытаетесь получить доступ к свойству связанного объекта (что приведет к его загрузке в Doctrine) или визуализировать объект в форме symfony, а поле в форме относится к свойству внешней таблицы.

К сожалению, нет простого способа остановить или поймать это. Моим советом было бы вручную проверять данные на наличие неприятных внешних ключей и очищать данные, ленивая загрузка Doctrine особенно неумолима из-за плохих данных, и Symfony просто делает это хуже, взорвав ошибку 500, если натолкнется на ссылку duff.

Смежные вопросы