首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP EntityCollection的选择

PHP EntityCollection的选择
EN

Stack Overflow用户
提问于 2021-11-25 15:54:24
回答 1查看 99关注 0票数 0

我是PHP和Symfony的初学者,最近我开始了一个项目。

我们有两个实体,它们是由教义注释ManyToMany与JoinTable相关联的

例如:实体与数据表Room,entity and datatable Person和datatable RoomPerson (实体不存在,仅存在于理论注释JoinTable中)。

实体室有一个个人财产集合。

使用formType,它在页面中呈现为select html元素多个(因此我们可以选择几个人)

FormType和preEvent一起填写可能的人名单:

代码语言:javascript
复制
$allowedPersons = $this->em->getRepository(Person::class)->findBy(***);
    $form
        ->add('personList', EntityType::class, [
            'class' => Person::class,
            'choices' => $allowedPersons ,

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Room::class,

新的要求是订购人员名单。

因此,我进行了一些教程中描述的更改,以更改声明实体RoomPerson和删除注释( ManyToMany )的ManyToOne和OneToMany。我在RoomPerson上添加了属性"Order“。我添加了AddRoomPerson和RemoveRoomPerson方法,通过映射RemoveRoomPerson来更新列表。

所以我的实体"Room“现在只包含一个RoomPerson的属性集合。但是我不知道如何在我的FormType中使用它,因为我总是想显示人员列表。

我尝试了很多东西,但都没有成功。

示例:

代码语言:javascript
复制
$allowedPersons = $this->em->getRepository(Person::class)->findBy(***);
    $form
        ->add('roomPersonList', EntityType::class, [
            'class' => RoomPerson::class,
            'choices' => $allowedPersons ,
            'choice_value' => function(?RoomPerson $roomPerson) {
                return $roomPerson? $roomPerson->getPerson()->getIdPerson() : '';
            },
            'choice_label' => function(?RoomPerson $roomPerson) {
                return $roomPerson? $roomPerson->getPerson()->getName() : '';
            },

我得到以下错误:

传递给App\Form\RoomPersonType::App\Form{

}()的参数1必须是App\Entity\RoomPerson或null的实例,即在第200行调用的App\Entity\Person给定的实例“

因此,我需要帮助,以转换我的表单类型的RoomPerson列表,并在页面中更新此列表。

EN

回答 1

Stack Overflow用户

发布于 2021-11-26 18:52:50

创建表单时,->add将引用在App\Entity中定义的不同列。

因此,如果您想以这种方式向表单添加某些内容,则必须再次用App\Entity表示它。

现在,您想要做的是,AFAIU用人员填充Room (类Person),并保存房间(RoomPerson)、中的人的列表,以及每个人都在哪里的列表(这就是为什么它是ManyToMany)。

相反,如果您只查看Person是最后一次或现在的位置,那么它是OneToMany关系,因为房间可以容纳一群人,但是任何人每次只能在一个地方(很明显)是

现在,我将简单地认为您想要实现ManyToMany的情况是理所当然的。您应该拥有RoomPerson中所需的所有列。

现在,RoomPerson应该简单地连接这两者,并且它是自己的id。您可以添加更多的内容,但是为了本例的目的,让我们假设我们只需要它是一个简单的关联表,所以.您的表看起来像(例如):

代码语言:javascript
复制
                      <-M:N->
Room:     <-M->     RoomPerson     <-N->    Person:
   - id (pk)           - id (pk)                - id (pk)
   - space             - room_id (fk)           - gender
   - style             - person_id (fk)         - room_usage
   - purpose                                    - age
   - etc etc...                                 - etc etc...

M为一边可定位对象的M个数,N为另一侧可定位对象的N个个数。

一旦您有了这样的DB,您就可以简单地创建一个表单,在其中传递一个Room,其中包含您需要的每一行。

如果您想要的是选择一个room 并让所有用户显示,您可以通过查询获取每个房间中所有人员的列表,然后将其发送到表单,然后在模板端上播放htmljs,以便在每个房间中显示正确的列表。

我需要一个更精确的描述来确切地知道你想要完成什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70114021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档