我有如下三个实体:
-available-teams(由管理员管理)
-player-preconfig(由管理员管理)
-player-self](由User(Player本身)管理)
在此输入图像说明
可用团队:
-->所有可用团队
player-preconfig:
-->在这里,管理员可以预选允许玩家参加的队伍。(first-filter-many2many:available-teams<->player-preconfig)-视图中有很多复选框。
球员-自我:
-->在这里,球员应该能够选择他想参加的球队(多个)。但他不应该列出所有可能的可用团队,而应该列出剩下的团队。
类
/** * 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'
))
;
...
供您参考:=>我的第一个表单如下所示:
class Teams2ShowType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('teams2show', 'entity', array(
'multiple' => true,
'expanded' => true,
问题是这样的:
如果我现在就呈现表单,那么一切正常,但是会呈现一个巨大的复选框列表。整个实体呈现出来。
当然,因为我不知道如何只填充剩余的实体,这取决于可用的manytomany关系--teams<->player-preconfig)。
因为显然我实际的Teams2ShowType不知道只有剩下的团队才应该出现。
我已经尝试了很多,阅读了很多(query_builder、model transformer等),但我不能正确地处理它。
我的真实示例(在公司中)需要处理许可方和合作伙伴配置,但我希望在一个更容易理解的场景中提出这个问题。
我不知道如何实施这项权利的任何最佳做法。
非常感谢你的帮助,我已经尝试解决这个问题超过3-4天。
亲切的问候,
可以使用query_builder选项。只需使用条令查询生成器API就可以获得在表单中呈现的所需实体,而不是所有实体
我有如下三个实体: -available-teams(由管理员管理) -player-preconfig(由管理员管理) -player-self](由User(Player本身)管理) 在此输入图像说明 可用团队: -->所有可用团队 player-preconfig: -->在这里,管理员可以预选允许玩家参加的队伍。(first-filter-many2many:available-teams
我试图坚持两个实体,它们有一对一和多对一的关系。 我正在尝试将表单集合嵌入到表单中。 我有一个多对一相关的实体,每次我创建一个新的课程简历,它与Candidat列相关candidat_id_id为空。 除了数据可数据中的Candidat id之外,只有实体Curendar umVitae被成功创建和持久化。 简历表 id|titre|candidat_id_id|id_education cand
我正在试图找出设置实体图的最佳方法。我将基于下面的图像进行解释。 TBLParentCustomer:此表存储主要客户的信息,主要客户可以是企业或消费者。(使用查找表TBLCustomerType标识这些客户。) TBLChildCustomer:此表存储主客户下的客户。主要业务客户可以有授权员工和授权代表,主要消费客户可以有授权用户。(它们是使用查找表TBLCustomerType标识的。) T
此代码崩溃: 原因:组织。postgresql。util。PSQLException:错误:关系“订阅”不存在 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect Springjpa。数据库平台=组织。冬眠地方话PostgreSQL10方言Spring。jpa。冬眠ddl auto=创建拖放
问题内容: 如何在EJB 3.0实体Bean(JPA)中建立单向关系? 例如,客户了解Order,但是Order没有任何针对客户的方法。使用(@OneToMany或@OneToOne或@ManyToMany) 问候 问题答案: 使用JPA 2.0 建立单向关系的方法如下: 关系型数据库: 顾客: 订购:
在@JoinColumn中的一对多关系中,我从子表中设置name,从父表中设置reference column。但是,当我在上面的person类中用@OneToOne定义相同的单向关系时,我必须从person表而不是从name表中设置@JoinColumn名称。 我的问题是为什么这两个连接条件中的定义名称不同,在一个条件中,我必须将该名称设置为来自同一表的PK列名的名称,而在第二个示例中,我必须设