8000 @UniqueEntity Constraint on superclasses · Issue #19566 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

@UniqueEntity Constraint on superclasses #19566

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ghost opened this issue Aug 8, 2016 · 3 comments
Closed

@UniqueEntity Constraint on superclasses #19566

ghost opened this issue Aug 8, 2016 · 3 comments

Comments

@ghost
Copy link
ghost commented Aug 8, 2016

@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?

@jakzal
Copy link
Contributor
jakzal commented Aug 9, 2016

possible duplicate #4087

@ogizanagi
Copy link
Contributor

I confirm this is a duplicate of #4087 (and many others).

We're missing opinions on both #15002 and #16969 proposals.

@javiereguiluz
Copy link
Member

Closing this issue as duplicate of #4087.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants
0