2016-09-30 7 views
0

Когда я добавляю поля своего объекта в формах Symfony, аннотации объектов сопоставляются и основываются на этом предположении Symfony, если мое поле может быть нулевым или нет, настолько хорошее, такие, как этот дамп:Symfony формы, угадать требуемый атрибут в полях ассоциации

public 'fieldMappings' => 
array (size=5) 
    'acl' => 
    array (size=9) 
     'fieldName' => string 'acl' (length=3) 
     'type' => string 'smallint' (length=8) 
     'scale' => int 0 
     'length' => null 
     'unique' => boolean false 
     'nullable' => boolean true 
     'precision' => int 0 
     'options' => 
     array (size=2) 
      ... 
     'columnName' => string 'acl' (length=3) 
    'id' => 
    array (size=10) 
     'fieldName' => string 'id' (length=2) 
     'type' => string 'integer' (length=7) 
     'scale' => int 0 
     'length' => null 
     'unique' => boolean true 
     'nullable' => boolean false 
     'precision' => int 0 
     'options' => 
     array (size=2) 
      ... 
     'columnName' => string 'id' (length=2) 
     'id' => boolean true 

Но если у меня есть связывающие поля (внешние ключи), Symfony имеет другую структуру отображения и не догадывается, если поле может быть обнуляемым или нет, например, как это свалка:

public 'associationMappings' => 
array (size=3) 
    'userObj' => 
    array (size=19) 
     'fieldName' => string 'userObj' (length=7) 
     'joinColumns' => 
     array (size=1) 
      ... 
     'cascade' => 
     array (size=0) 
      ... 
     'inversedBy' => null 
     'targetEntity' => string 'AdminBundle\Entity\User' (length=23) 
     'fetch' => int 2 
     'type' => int 2 
     'mappedBy' => null 
     'isOwningSide' => boolean true 
     'sourceEntity' => string 'AdminBundle\Entity\UserAcl' (length=26) 
     'isCascadeRemove' => boolean false 
     'isCascadePersist' => boolean false 
     'isCascadeRefresh' => boolean false 
     'isCascadeMerge' => boolean false 
     'isCascadeDetach' => boolean false 
     'sourceToTargetKeyColumns' => 
     array (size=1) 
      ... 
     'joinColumnFieldNames' => 
     array (size=1) 
      ... 
     'targetToSourceKeyColumns' => 
     array (size=1) 
      ... 
     'orphanRemoval' => boolean false 
    'storeObj' => 
    array (size=19) 
     'fieldName' => string 'storeObj' (length=8) 
     'joinColumns' => 
     array (size=1) 
      ... 
     'cascade' => 
     array (size=0) 
      ... 
     'inversedBy' => null 
     'targetEntity' => string 'AdminBundle\Entity\Store' (length=24) 
     'fetch' => int 2 
     'type' => int 2 
     'mappedBy' => null 
     'isOwningSide' => boolean true 
     'sourceEntity' => string 'AdminBundle\Entity\UserAcl' (length=26) 
     'isCascadeRemove' => boolean false 
     'isCascadePersist' => boolean false 
     'isCascadeRefresh' => boolean false 
     'isCascadeMerge' => boolean false 
     'isCascadeDetach' => boolean false 
     'sourceToTargetKeyColumns' => 
     array (size=1) 
      ... 
     'joinColumnFieldNames' => 
     array (size=1) 
      ... 
     'targetToSourceKeyColumns' => 
     array (size=1) 
      ... 
     'orphanRemoval' => boolean false 

В этом случае требуемый атрибут должен быть настроен m в противном случае это будет верно (это значение по умолчанию для форм Symfony).

Кто-нибудь знает, как Symfony может угадать требуемый атрибут в этих случаях? Моя сущность имеет следующие аннотации:

/** 
* @ORM\ManyToOne(targetEntity="User") 
* @ORM\JoinColumn(name="fk_user", referencedColumnName="id", nullable=false, unique=false, onDelete="CASCADE") 
*/ 
private $userObj; 

/** 
* @ORM\ManyToOne(targetEntity="Store") 
* @ORM\JoinColumn(name="fk_store", referencedColumnName="id", nullable=false, unique=false, onDelete="CASCADE") 
*/ 
private $storeObj; 

ответ

0

Вы можете создать TypeGuesser service. Это, черт возьми, много работы, так почему же не вручную устанавливать поля один раз и делать с ним?

+0

Спасибо за ваш ответ, на данный момент я делаю это, но было бы хорошо, если бы Symfony выполнял эту работу так же, как и с оставшимися полями. –