有没有办法强制 ManyToMany 关系表现为 ManyToOne?

Is there any way to force a ManyToMany relationship behaves as ManyToOne?

我有这两个实体 CommandPredetermined,它们是相关的 ManyToMany:

class Command
{
    use IdentifierAutogeneratedTrait;
    use TimestampableEntity;
    use ActiveTrait;

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

    /**
     * @var string
     * @ORM\Column(type="text", nullable=true)
     */
    private $description;

    /**
     * @var Predetermined[]
     * @ORM\ManyToMany(targetEntity="Predetermined", mappedBy="commands", cascade={"persist"})
     */
    private $predetermined;

    ...
}

class Predetermined
{
    use IdentifierAutogeneratedTrait;
    use TimestampableEntity;
    use ActiveTrait;

    /**
     * @var string
     * @ORM\Column(type="string", length=160)
     * @Assert\NotBlank()
     */
    private $smsText;

    /**
     * @var Command[]
     * @ORM\ManyToMany(targetEntity="Command", inversedBy="predetermined", cascade={"persist", "remove"})
     * @ORM\JoinTable(name="predetermined_has_command")
     */
    private $commands;

    ...
}

有什么方法可以使用一种形式(这是我在这里看到的唯一一种形式)来改变他们的行为方式?看看下面的图片:

我允许在这里选择许多命令,这就是为什么我使用 ManyToMany 但是 ...

在这一个中我没有,所以我仍然需要使用相同的实体,但在表单级别更改行为。任何人都可以给我一些帮助吗?我该如何实现?

通常在您的 FormBuilder 字段中使用 multiple 属性,例如

$builder->add('commands', 'entity', array(
    'class'     => 'YourBundle:Command',
    'multiple'  => yourCondition ? true : false,
));

我从这个 PR 找到了 EasyAdminBundle 的方法,你应该可以使用下面的

// app/config/admin/entities/YourEntity
fields:
    - { property: 'commands', multiple: false }

对于一种形式,对于另一种形式将其设置为 false。
或者您可以定义一个参数,例如:

- { property: 'commands', multiple: %condition% }