gpt4 book ai didi

php - 实体的父 ID 未保存在 SonataAdmin 中的 OneToMany 关系中

转载 作者:IT王子 更新时间:2023-10-29 00:11:40 24 4
gpt4 key购买 nike

我正在使用 SonataAdmin(和 Symfony2)来管理我的实体。我在一个步骤和多个任务之间有一个一对多的关系。由于一个步骤可以包含多个任务,因此当我创建一个步骤时,我希望能够创建多个任务并且我希望这些任务链接到该步骤。为此,我创建了所有适当的管理类(一个用于任务,一个用于步骤)。

这是导致我遇到问题的原因。当我尝试创建一个 Step 时,我可以创建任务,甚至可以重新排序它们,这非常好,而且所有操作都由 SonataAdminBundle 自动完成。当我点击保存时,一切都保存在数据库中,除了在数据库中,任务的行中没有设置步骤的id。因此,任务没有链接到步骤...

这是我的 Step 的管理类:

<?php
// src/Acme/DemoBundle/Admin/PostAdmin.php

namespace IMA\ProcessManagementBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;

class StepAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array('label' => 'Nom de l\'étape'))

->add('tasks', 'sonata_type_collection', array(), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'positionNumber'
))
->add('positionNumber', 'integer', array('label' => 'Position'))
;
}

// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')

;
}

// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('slug')
;
}
}

这也是我的任务管理类:

<?php
// src/Acme/DemoBundle/Admin/PostAdmin.php

namespace IMA\ProcessManagementBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;

class TaskAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array('label' => 'Tâche'))
->add('positionNumber', 'integer', array('label' => 'Position'))

;
}

// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')

;
}

// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('slug')
;
}
}

此外,这是我的实体的描述

IMA\ProcessManagementBundle\Entity\Step:
type: entity
table: null
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string
length: 255
positionNumber:
type: integer


oneToMany:
tasks:
targetEntity: Task
mappedBy: step
cascade: ["persist", "merge"]

lifecycleCallbacks: { }


IMA\ProcessManagementBundle\Entity\Task:
type: entity
table: null
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string
length: 255
positionNumber:
type: integer


manyToOne:
step:
targetEntity: Step
inversedBy: tasks


lifecycleCallbacks: { }

我想知道为什么没有在任务行中设置步骤的 id...

最佳答案

您需要手动将步骤附加到任务,为此您需要使用步骤管理类中的 prePersist 和 preUpdate 方法...

原因是 SonataAdminBundle 的开发人员说处理这个问题是 doctrine 的关注点,而 Doctrine 开发人员说这是 bundle 的责任...所以现在我们需要自己做。

这将是您的新 stepAdmin 类:

<?php
namespace IMA\ProcessManagementBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;

class StepAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array('label' => 'Nom de l\'étape'))

->add('tasks', 'sonata_type_collection', array(), array(
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'positionNumber'
))
->add('positionNumber', 'integer', array('label' => 'Position'))
;
}

// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('name')

;
}

// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('slug')
;
}


public function prePersist($object)
{
foreach ($object->getTasks() as $task) {
$task->setStep($object);
}
}

public function preUpdate($object)
{
foreach ($object->getTasks() as $task) {
$task->setStep($object);
}
}


}

关于php - 实体的父 ID 未保存在 SonataAdmin 中的 OneToMany 关系中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21420380/

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