Symfony表单,用于将用户兴趣的选择存储到UserInterests - php

我的目的是使用Symfony表单允许用户选择多个兴趣并将其与用户相对保存。

我有三个实体来映射和存储此数据:

User
 - id
 - name

Interest
 - id
 - name

UserInterest
 - id
 - user_id (FK ManyToOne user.id)
 - interest_id (FK ManyToOne interest.id)

我正在努力寻找最动态的Symfony方法来处理InterestUser并将其保存到UserInterest实体。

InterestsController.php

public function interests(Request $request)
{
    $error = null;

    $userInterests = new UserInterest();
    $userInterests->setUser($this->getUser());

    $form = $this->createForm(UserAccountInterests::class, $userInterests);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        try {
            $this->entityManager->persist($userInterests);
            $this->entityManager->flush();
    } catch (\Exception $e) {
            $error = $e->getMessage();
        }
    }

    $parameters = [
        'error' => $error,
        'user_interests_form' => $form->createView()
    ];

    return $this->render('user/interests.html.twig', $parameters);
}

UserInterestsType.php

class UserInterestsType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
        ->add('interest', EntityType::class, [
            'class' => Interest::class,
            'choice_label' => 'name',
            'expanded' => true,
            'multiple' => true
        ])
        ->add('update', SubmitType::class);
    }
 }

问题

我目前面临的问题是,在提交表单时,这会创建链接到UserInterestuser实体的实例化,但是将多个选定的Interest作为数组而不是多个UserInterest

我该如何以正确的Symfony方式执行此操作,以允许使用一种表单和简单的控制器逻辑,以便用户可以加载页面,从多个复选框类型中选择他们感兴趣的内容,单击“保存”,然后在重新加载表单时将其自动填充为事先选择?

参考方案

对于您要实现的目标,您的第一个解决方案有点太复杂了。如果只希望用户选择一些兴趣,则不需要UserInterest实体。

我可以想到的是,专用于该关系的新实体的唯一用途是该关系带有一些您要保留的额外属性,例如关系开始的日期,订单或优先级或您需要的任何内容。如果您要存储的唯一数据是userId和interestId,那么一个新的实体将不会给您带来很多麻烦,而是会带来很多麻烦。
您也不需要CollectionType(无论如何也不会在此表单上产生新的兴趣)。在用户和兴趣之间建立简单的ManyToMany关系

 User:
  type: entity
  manyToMany:
    interests:
      targetEntity: Interest
      inversedBy: users
      joinTable: 
        ## name will be the name of the table storing your entities 's relations
        ## Beware not to give it a name already defined for an entity table (like your UserInterest wich you don't need anymore)
        name: users_interests 
        joinColumns:
          user_id:
            referencedColumnName: id
        inverseJoinColumns:
          interest_id:
            referencedColumnName: id

Interest:
  type: entity
  manyToMany:
    users:
      targetEntity: User
      mappedBy: interests

然后,您可以使用以下形式的简单多个EntityType:data_class是User,而您的objecttype的类是Interest:

class UserInterestsType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
        ->add('interests', EntityType::class, [
            'class' => Interest::class,
            'choice_label' => 'name',
            'expanded' => true,
            'multiple' => true,
            'query_builder' => function (EntityRepository $er) {
    return $er->createQueryBuilder('u')
        ->orderBy('u.name', 'ASC');
}, 
        ])
        ->add('update', SubmitType::class);
    }
 }

然后,假设您要检索共享特定兴趣或特定用户兴趣的用户,则您现有的用户和兴趣存储库中将具有以下类型的查询:

// UserRepository: All users sharing one (or more) interests
$em = $this->getEntityManager();
$repository = $em->getRepository('YourNamespace:User');
$query = $repository->createQueryBuilder('u')
    ->innerJoin('u.interests', 'i')
    ->where('i.id = :interest_id')
    ->setParameter('interest_id', 5) // just for the example
    ->getQuery()->getResult();

// InterestRepository: All interests of one user 
$em = $this->getEntityManager();
$repository = $em->getRepository('YourNamespaceYourBundle:Interest');
$query = $repository->createQueryBuilder('i')
    ->innerJoin('i.users', 'u')
    ->where('u.id = :user_id')
    ->setParameter('user_id', 1)
    ->getQuery()->getResult();

验证IBAN PHP - php

在设计新平台时,我们尝试集成IBAN编号。我们必须确保IBAN已经过验证,并且存储在数据库中的IBAN始终正确。那么验证数字的正确方法是什么? 参考方案 正如我在其他问题中解释的逻辑一样,我尝试自己创建一个函数。根据Wikipedia文章中解释的逻辑,在下面找到合适的功能。国家特定验证。它适合吗http://en.wikipedia.org/wiki/Int…

symfony 2路由模型 - php

Sf2.0,例如标准博客。routing.yml代码:DevBlogBundle_post_show: pattern: /posts/{id} defaults: { _controller: "DevBlogBundle:Post:show" } requirements: _method: GET id: \d+ 我使用以下方法为我…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…