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

标签 mysql symfony doctrine formbuilder

我有三个这样的实体:
-可用团队(由管理员管理)
-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/

相关文章:

php - Wamp 和 Xampp "Your PHP installation appears to be missing the MySQL extension which is required by WordPress."

java - Spring Boot native 查询抛出错误,但在mysql中有效

php - Symfony2 Controller 和模板表达式可以相对于 bundle 来写吗?

forms - 测试 Symfony2 Forms 导致无法加载类型 "entity"

PHPUnit 覆盖现在不完整,因为类的左大括号没有被覆盖

PHP ->exec() 成功,但表中没有存储任何内容?

php - 语义 Ui 自动完成

symfony - 有没有办法设置 Doctrine 事件监听器,将每个实体查询限制为特定字段 id?

mysql - Doctrine 内连接

symfony - 如何使用在 Controller 中返回假存储库的模拟实体管理器?