Symfony 3 uniqueEntity验证具有多对多的关系

时间:2017-09-22 15:53:30

标签: php mysql symfony doctrine

我很难找到解决这个问题的方法: 我有两个班级联系和电话有很多关系。电话表有2个字段:countryCode和number。我想检查2个联系人是否没有相同的电话号码,因此验证了2个字段的组合。最后一个代码是这个,但我尝试了很多可能性。

    /**
     * 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';
        }
    }

使用此代码,我收到以下错误:

    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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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 \ Valid()注释是要求Symfony强制验证私有$ phoneNb变量引用的“子对象”的方法。