2017-09-22 2 views
3

나는이 문제에 대한 해결책을 찾는 데 어려움을 겪고 있습니다. 나는 manytomany 관계로 2 클래스의 연락처와 전화를 가지고 있습니다. phones 테이블에는 countryCode와 number의 두 필드가 있습니다. 나는 2 개의 연락처가 같은 전화 번호를 가지고 있지 않은지 확인하고 싶기 때문에 2 개의 필드의 조합에 대한 유효성을 검사한다. 마지막 코드는이 코드이지만 많은 가능성을 시험해 보았습니다. Symfony 3 many-to-many 관계가있는 uniqueEntity 유효성 확인

An exception occurred while executing 'SELECT t0.id AS id_1, t0.title AS title_2, t0.first_name AS first_name_3, t0.surname AS surname_4, t0.email AS email_5 FROM contact t0 WHERE contact_phones.phone_id = ?' with params [{}]: 

    SQLSTATE[42S22]: Column not found: 1054 Champ 'contact_phones.phone_id' inconnu dans where clause 

여러분의 도움에 감사드립니다 : 나는 다음과 같은 오류가이 코드

/** 
    * Contact 
    * 
    * @ORM\Table(
    *  name="contact" 
    *) 
    * @ORM\Entity(repositoryClass="EPI\PlatformBundle\Repository\ContactRepository") 
    * 
    * @UniqueEntity(fields={"email"}, message="ce mail existe déjà") 
    * @UniqueEntity(fields={"phoneNumbers"}, message="this phone number already exists") 
    * 
    */ 
    class Contact 
    { 
     /** 
     * @var int 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 


     /** 
     * One User can have several Phonenumbers. 
     * @ORM\ManyToMany(targetEntity="Phone", cascade={"persist", "remove"}, orphanRemoval=true) 
     * @ORM\JoinTable(name="contact_phones", 
     *  joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id", onDelete="CASCADE")}, 
     *  inverseJoinColumns={@ORM\JoinColumn(name="phone_id", referencedColumnName="id", unique=true, onDelete="CASCADE")} 
     *  ) 
     */ 


    /** 
    * Phone   
    * 
    * @ORM\Table(name="phone") 
    * @ORM\Entity(repositoryClass="EPI\PlatformBundle\Repository\PhoneRepository") 
    * 
    */ 

    class Phone 
    { 
     /** 
     * @var int 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="country_code", type="string", length=4) 
     */ 
     private $countryCode; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="phone_nb", type="string", length=9) 
     */ 
     private $phoneNb; 



    class ContactType extends AbstractType 
    { 
     /** 
     * {@inheritdoc} 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('title', ChoiceType::class, array(
        'choices' => array(
         'Madame' => 'Madame', 
         'Monsieur' => 'Monsieur' 
        ) 
       )) 
       ->add('firstName', TextType::class) 
       ->add('surname', TextType::class) 
       ->add('email', EmailType::class) 
       ->add('phoneNumbers', CollectionType::class, array(
        'entry_type' => PhoneType::class, 
        'entry_options' => array('label' => false), 
        'allow_add' => 'true', 
        'allow_delete' => 'true', 
        'error_bubbling' => 'true' 
       )); 
     } 

     /** 
     * {@inheritdoc} 
     */ 
     public function configureOptions(OptionsResolver $resolver) 
     { 
      $resolver->setDefaults(array(
       'data_class' => 'EPI\PlatformBundle\Entity\Contact', 
      )); 
     } 

     /** 
     * {@inheritdoc} 
     */ 
     public function getName() 
     { 
      return 'contact'; 
     } 

     /** 
     * {@inheritdoc} 
     */ 
     public function getBlockPrefix() 
     { 
      return 'contact'; 
     } 
    } 

.

+0

많은 관계'php bin/console doctrine : schema : update --force'를 작성한 후에 스키마를 업데이트 했습니까? – teeyo

+0

코드가 불완전하기 때문에 질문을 짧게하기 위해 일부 수업이 생략되었지만 설명서의 모든 지침을 따랐다면 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/ association-mapping.html # many-to-many-unidirectional 아마도 데이터베이스 스키마를 업데이트하는 것을 잊어 버렸기 때문에 언급 된 예외가 발생할 수 있습니다. – teeyo

+0

스키마를 업데이트했습니다. 그러나 manytomany 관계는 잘 작동합니다. 내가 가지고있는 문제는 uniqueEntity 유효성 검사와 관련이 있습니다. – Jerry

답변

0

연락처 엔티티의 "uniqueEntity"주석이 올바른 방법으로 작동하지 않는다는 것을 알았습니다.이 주석은 전화 엔티티에 있어야하지만 "@Assert \ Valid()"주석은 연락처 엔티티 내의 전화 객체를 가리키는 콜렉션 참조 맨 위에 추가됩니다.

class Contact 
    { 
     /** 
       * @var int 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * One Contact can have Many Addresses. 
     * @ORM\ManyToMany(targetEntity="Address", cascade={"persist", "remove"}, orphanRemoval=true) 
     * @ORM\JoinTable(name="contact_addresses", 
     *  joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id", onDelete="CASCADE")}, 
     *  inverseJoinColumns={@ORM\JoinColumn(name="address_id", referencedColumnName="id", unique=true, onDelete="CASCADE")} 
     *  ) 
     */ 
     private $addresses; 

     /** 
     * One User can have several Phonenumbers. 
     * @ORM\ManyToMany(targetEntity="Phone", cascade={"persist", "remove"}, orphanRemoval=true) 
     * @ORM\JoinTable(name="contact_phones", 
     *  joinColumns={@ORM\JoinColumn(name="contact_id", referencedColumnName="id", onDelete="CASCADE")}, 
     *  inverseJoinColumns={@ORM\JoinColumn(name="phone_id", referencedColumnName="id", unique=true, onDelete="CASCADE")} 
     *  ) 
     * 
     * @Assert\Valid() 
     * 
     */ 
     private $phoneNumbers; 


    <?php 

    namespace EPI\PlatformBundle\Entity; 

    use Doctrine\ORM\Mapping as ORM; 
    use Symfony\Bridge\Doctrine\  Validator\Constraints\UniqueEntity; 

    /** 
    * Phone 
    * 
    * @ORM\Table(name="phone") 
    * @ORM\Entity(repositoryClass="EPI\PlatformBundle\Repository\PhoneRepository") 
    * 
    * 
    * @UniqueEntity(fields={"countryCode","phoneNb"}, message="ce numéro de téléphone existe déjà") 
    */ 

    class Phone 
    { 
     /** 
     * @var int 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="country_code", type="string", length=4) 
     */ 
     private $countryCode; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="phone_nb", type="string", length=9) 
     */ 
     private $phoneNb; 

@Assert \ 유효() 주석이 민간 $ phoneNb 변수가 참조하는 "하위 개체"의 검증을 강제로 심포니를 요청하는 수단이다 : 이 명확하게하기 위해, 여기에 코드입니다.

관련 문제