我有三个这样的实体:
-可用团队(由管理员管理)
-Player-PreConfig(由管理员管理)
-Player-Self](由用户管理(玩家本身))
可用团队:
--> 所有可用的团队
播放器预配置:
--> 管理员可以在这里预先选择允许玩家参加比赛的球队。 (First-Filter - Many2Many: Available-Teams<->Player-PreConfig) - View 中有很多复选框。
玩家 self :
--> 在这里玩家应该能够选择他想参加的球队(多个)。但是他不应该列出所有可能的可用球队,而应该只列出剩余的球队。
类
/**
* TeamsPlayerBundle\Entity\Teams
*
* @ORM\Table(name="team")
* @ORM\Entity
*/
class Team
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $name
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToMany(targetEntity="PreConfig", mappedBy="teams", cascade={"persist", "remove"})
**/
private $configs;
/**
* @ORM\ManyToMany(targetEntity="Player", mappedBy="teams2show", cascade={"persist"})
**/
private $players;
public function __construct()
{
$this->configs = new ArrayCollection();
$this->players = new ArrayCollection();
}
(... setters and getters)
###################################################
/**
* TeamsPlayerBundle\Entity\PreConfig
*
* @ORM\Table(name="preconfig")
* @ORM\Entity
*/
class PreConfig
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity="Teams", inversedBy="configs", cascade={"persist", "remove"})
* @ORM\JoinTable(name="preconfig_teams)
**/
private $teams;
public function __construct()
{
$this->teams = new ArrayCollection();
}
(... setters and getters)
####################################################
/**
* TeamsPlayerBundle\Entity\Player
*
*
* @ORM\Table(name="player")
* @ORM\Entity
*/
class Player
{
/**
* @var integer $player_id
*
* @ORM\Column(name="player_id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $player_id;
/**
* @var string $name
* @Assert\NotBlank
*
* @ORM\Column(name="name", type="string", length=64)
*/
private $name
/**
* @ORM\ManyToMany(targetEntity="Team", inversedBy="player", cascade={"persist"})
* @ORM\JoinTable(name="player_team",
* joinColumns={@ORM\JoinColumn(name="player_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")}
* )
**/
private $teams2show;
public function __construct()
{
$this->teams2show = new ArrayCollection();
}
(... setters and getters)
现在我有这个 FormType:我尝试按照“Viktor77”的建议用 Query_Builder 解决
namespace TeamsPlayerBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;
use TeamsPlayerBundle\Entity\Player;
class Teams2ShowType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('teams2show', 'entity', array(
'class' => 'TeamsPlayerBundle\Entity\PreConfig',
'query_builder' => function(EntityRepository $er) use ($cid) {
return $er->createQueryBuilder('c')
->add('orderBy', 'c.name ASC')
->innerJoin('c.teams', 'c2')
->where('c2.id = :configId')
->setParameter('configId', $cid);
},
'expanded' => true,
'multiple' => true,
'property_path' => 'teams2show',
'property' => 'name'
))
;
...<br />
供您引用:=> 我的第一个表格如下所示:
class Teams2ShowType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('teams2show', 'entity', array(
'multiple' => true,
'expanded' => true,
问题如下:
如果我现在呈现表单,一切正常,但会呈现大量复选框。呈现整个实体。
当然,因为我不知道如何根据多对多关系 Available-Teams<->Player-PreConfig 只填充剩余的实体。
因为很明显,我的实际 Teams2ShowType 不知道应该只显示其余的团队。
我已经尝试了很多,也阅读了很多(query_builder、model transformer 等),但我还是做不好。
我的真实示例(在公司中)必须对许可方和合作伙伴配置做一些事情,但我想在更容易理解的场景中提出这个问题。
我不知道关于如何实现此权利的任何最佳实践。
非常感谢您的提前帮助,我已经尝试解决该问题超过 3-4 天。
亲切的问候,
最佳答案
query_builder 选项是要走的路。只需使用 Doctrine Query Builder API 即可仅获取您需要在表单中呈现的实体,而不是所有实体
关于mysql - 如何根据不相关的关系过滤 Symfony 表单实体输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33020247/