gpt4 book ai didi

mysql - 如何根据不相关的关系过滤 Symfony 表单实体输出

转载 作者:行者123 更新时间:2023-11-30 22:34:24 25 4
gpt4 key购买 nike

我有三个这样的实体:
-可用团队(由管理员管理)
-Player-PreConfig(由管理员管理)
-Player-Self](由用户管理(玩家本身)) enter image description here可用团队:
--> 所有可用的团队

播放器预配置:
--> 管理员可以在这里预先选择允许玩家参加比赛的球队。 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com