Symfony:按实体关系排序实体类型表单

Zgl*_*ukk 2 php forms symfony

我想在 symfony 中创建一个选择表单,其中条目按关系排序(我有具有多对一关系的客户端实体)。该表格应按企业对每个客户进行排序。

这是我的客户实体

/**
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="MyBrowserBundle\Entity\UserRepository")
 */
class User
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 *  @ORM\ManyToOne(targetEntity="MyBrowserBundle\Entity\Enterprise", inversedBy="user", cascade={"persist"})
 *  @ORM\JoinColumn(nullable=false)
 */
private $enterprise;

//Some data

// Setter Getter

/**
 * Set enterprise
 *
 * @param \MyBrowserBundle\Entity\Enterprise $enterprise
 * @return User
 */
public function setEnterprise(\MyBrowserBundle\Entity\Enterprise $enterprise)
{
    $this->enterprise = $enterprise;

    return $this;
}

/**
 * Get enterprise
 *
 * @return \MyBrowserBundle\Entity\Enterprise 
 */
public function getEnterprise()
{
    return $this->enterprise;
}
 public function __construct() {
   //Some code
}
}
Run Code Online (Sandbox Code Playgroud)

和我的企业实体

/**
 * @ORM\Table(name="enterprise")       *@ORM\Entity(repositoryClass="MyBrowserBundle\Repository\EnterpriseRepository")
 */
class Enterprise
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

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

/**
 * @ORM\OneToMany(targetEntity="MyBrowserBundle\Entity\User", mappedBy="enterprise", cascade={"persist"})
 */
private $user;
/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 * @return Enterprise
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}
/**
 * Constructor
 */
public function __construct()
{
    $this->user = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add user
 *
 * @param \MyBrowserBundle\Entity\User $user
 * @return Enterprise
 */
public function addUser(\MyBrowserBundle\Entity\User $user)
{
    $this->user[] = $user;
    //$user->setEnterprise($this);

    return $this;
}

/**
 * Remove user
 *
 * @param \MyBrowserBundle\Entity\User $user
 */
public function removeUser(\MyBrowserBundle\Entity\User $user)
{
    $this->user->removeElement($user);
}

/**
 * Get user
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getUser()
{
    return $this->user;
}
}
Run Code Online (Sandbox Code Playgroud)

我正在使用具有如下选择类型的二维数组($fullArray 是二维数组):

$formSearch = $this->createFormBuilder($fullArray)
                ->add('List', 'choice', array(
                    'choices' => $fullArray,
                    'choice_attr' => function($fullArray, $key, $index) {
                        return ['class' => 'category_'.$key];   
                    },
                    ))
                        ->add('search', 'submit')
                        ->getForm();
    $formSearch->handleRequest($request);
Run Code Online (Sandbox Code Playgroud)

问题是当 twig 渲染表单时,所有数据都是混合的。

还有另一种方法可以做到这一点吗?(使用 EntityType ?)我是 Symfony 2 的新手

谢谢

Zgl*_*ukk 8

所以,我只需将我的 formBuilder 更改为:

$formSearch         = $this->createFormBuilder($fullArray)
                        ->add('user', 'entity', array(
                            'class' => 'MyBrowserBundle:User',
                            'choice_label' => 'name',
                            'query_builder' => function (EntityRepository $er) {
                                return $er->createQueryBuilder('u')
                                    ->orderBy('u.enterprise', 'ASC');
                            },
                            'group_by' => function($val, $key, $index) {
                                return $val->getEnterprise()->getName();
                            },
                            ))
                        ->add('search', 'submit')
                        ->getForm();
Run Code Online (Sandbox Code Playgroud)

而且效果很好:)