Skip to content

@UniqueEntity Constraint on superclasses #19566

@ghost

Description

@stof @weaverryan @fabpot @totophe @genexp @rquadling @nud I am wondering if Symfony 3 has fixed the problem with unique constraints on super- and subclasses since it does not work for me...

For example, I have 2 sub-entities that are derived from an abstract parent entity and I gave the parent 2 unique constraints like this:

/**
 * User
 *
 * @ORM\Table(
 *     name="user",
 *     indexes={
 *          @ORM\Index(name="user_fn_ix", columns={"first_name"}),
 *          @ORM\Index(name="user_ln_ix", columns={"last_name"}),
 *          @ORM\Index(name="user_phone_ix", columns={"phone_number"}),
 *     }
 * )
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *      "courier": "AppBundle\Entity\User\Courier",
 *      "client": "AppBundle\Entity\User\Client",
 * })
 * @ORM\Entity(repositoryClass="AppBundle\Repository\User\UserRepository")
 * @UniqueEntity(fields={"email"})
 * @UniqueEntity(fields={"phoneNumber"})
 * @Serializer\ExclusionPolicy("all")
 * @Serializer\Discriminator(field="type", map={
 *      "courier": "AppBundle\Entity\User\Courier",
 *      "client": "AppBundle\Entity\User\Client",
 * })
 * @Vich\Uploadable()
 */
abstract class AbstractUser implements UserInterface { ... }
*/

There are 2 subclasses that are derived from the superclass:

/**
 * Client
 *
 * @ORM\Entity(repositoryClass="AppBundle\Repository\User\ClientRepository")
 * @Serializer\ExclusionPolicy("all")
 */
class Client extends AbstractUser {...}
/**
 * Courier
 *
 * @ORM\Entity(repositoryClass="AppBundle\Repository\User\CourierRepository")
 * @UniqueEntity(fields={"email"}, groups={"registration", "profile"})
 * @UniqueEntity(fields={"phoneNumber"}, groups={"registration", "profile"})
 * @Serializer\ExclusionPolicy("all")
 */
class Courier extends AbstractUser { ... }

I created a form type for Courier

class CourierType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('avatarFile', FileType::class, ['required' => true])
            ->add('firstName', TextType::class, ['required' => true])
            ->add('lastName', TextType::class, ['required' => true])
            ->add('email', EmailType::class, ['required' => true])
            ->add('password', PasswordType::class, ['required' => true])
            ->add('phoneNumber', PhoneNumberType::class, [
                'widget' => PhoneNumberType::WIDGET_COUNTRY_CHOICE,
                'country_choices' => ['US'],
                'preferred_country_choices' => ['US'],
                'default_region' => 'US',
                'required' => true,
            ])
            ->add('address', TextType::class, ['required' => true])
            ->add('zipCode', TextType::class, ['required' => true])
            ->add('biography', TextareaType::class, ['required' => true])
            ->add('vehicleType', TextType::class, ['required' => true])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Courier::class,
            'validation_groups' => ['Default', 'registration'],
        ]);
    }

    public function getName()
    {
        return 'courier';
    }
}

Validation Code:

class AppController extends Controller
{
    public function indexAction(Request $request)
    {
       $form = $this->createForm(CourierType::class, new Courier());
       $form->handleRequest($request);

       if ($form->isValid()) {
          echo 'yes';
       } else {
         echo 'invalid';
       }
    }
}

Running the controller always gives me 'yes' even if I pass a duplicate email or phone number. This means the @UniqueConstraint constraints are not working.
I thought this should be fixed now as this issue has been raised by many.

What's wrong with the code?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions