无法使用 SF2 表单删除具有多对多相关对象的实体
Unable to delete Entity with Many to Many related objects using SF2 Form
我有一个 activity 规划系统,但我遇到了一个问题。我的主要项目称为 AircrewAvailability 并通过多对多关系链接到 Period 项目(Period 必须保持不可知,以便其他实体可以使用它而无需存储它们的 ID)。
此可用性显示在 FullCalendar 系统上:每个可用性的每个时期都是 FullCalendar 上的一个事件。单击 FullCalendar 时,我们会访问 CRUD 表单。
创建和编辑都可以,但是删除很麻烦。当我尝试删除可用性时,ORM 会尝试删除期间但不会触及关系 table(aircrew_availability_period),因此我违反了完整性约束(这很有意义)。
这是我的映射:
可用性实体:
<entity name="Mouke\Component\Availability\Model\AircrewAvailability" table="TBL_aircrew_availability">
<id name="id" length="40">
<generator strategy="CUSTOM"/>
<custom-id-generator class="Mouke\Component\Resource\Doctrine\ORM\Id\Sha1IdGenerator"/>
</id>
<many-to-many target-entity="Mouke\Component\Application\Model\PeriodInterface" field="periods" orphan-removal="true" fetch="EAGER">
<cascade>
<cascade-all/>
</cascade>
<join-table name="aircrew_availability_period">
<join-columns>
<join-column name="aircrew_availability_id"/>
</join-columns>
<inverse-join-columns>
<join-column name="period_id"/>
</inverse-join-columns>
</join-table>
<gedmo:versioned/>
</many-to-many>
</entity>
</doctrine-mapping>
期间实体:
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping">
<entity name="Mouke\Component\Application\Model\Period" table="TBL_period">
<id name="id" column="id" type="string" length="40">
<generator strategy="CUSTOM"/>
<custom-id-generator class="Mouke\Component\Resource\Doctrine\ORM\Id\Sha1IdGenerator"/>
</id>
<field name="startedAt" column="started_at" type="datetime"/>
<field name="endedAt" column="ended_at" type="datetime"/>
</entity>
</doctrine-mapping>
关于我的表格,这里是相关部分:
可用性表:
$builder->add('periods', CollectionType::class, [
'entry_type' => PeriodType::class,
'label' => 'Periods',
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'attr' => [
'class' => 'ajax-collection section-no-padding',
],
]);
期间形式:
$builder
->add('startedAt', DateTimePickerType::class, [
'label' => 'model.started_at',
'model_timezone' => $options['model_timezone'],
])
->add('endedAt', DateTimePickerType::class, [
'label' => 'model.ended_at',
'model_timezone' => $options['model_timezone'],
]);
棘手的部分:我可以从可用性中删除一个时间段,没问题。但是,如果可用性没有时间段,则它不会显示在我的日历中,因此您无法再对其进行编辑。不仅 "ghost entity" 可能会有我不想处理的副作用,而且 "delete periods" 删除整个可用性对用户来说也不友好,尤其是当你有一个巨大的 "Delete" 按钮在表格底部。
对这个问题有什么想法吗?
错过了 on-delete="CASCADE"
符号:
<join-table name="aircrew_availability_period">
<join-columns>
<join-column name="aircrew_availability_id" on-delete="CASCADE"/>
</join-columns>
<inverse-join-columns>
<join-column name="period_id" on-delete="CASCADE"/>
</inverse-join-columns>
</join-table>
我有一个 activity 规划系统,但我遇到了一个问题。我的主要项目称为 AircrewAvailability 并通过多对多关系链接到 Period 项目(Period 必须保持不可知,以便其他实体可以使用它而无需存储它们的 ID)。
此可用性显示在 FullCalendar 系统上:每个可用性的每个时期都是 FullCalendar 上的一个事件。单击 FullCalendar 时,我们会访问 CRUD 表单。
创建和编辑都可以,但是删除很麻烦。当我尝试删除可用性时,ORM 会尝试删除期间但不会触及关系 table(aircrew_availability_period),因此我违反了完整性约束(这很有意义)。
这是我的映射:
可用性实体:
<entity name="Mouke\Component\Availability\Model\AircrewAvailability" table="TBL_aircrew_availability">
<id name="id" length="40">
<generator strategy="CUSTOM"/>
<custom-id-generator class="Mouke\Component\Resource\Doctrine\ORM\Id\Sha1IdGenerator"/>
</id>
<many-to-many target-entity="Mouke\Component\Application\Model\PeriodInterface" field="periods" orphan-removal="true" fetch="EAGER">
<cascade>
<cascade-all/>
</cascade>
<join-table name="aircrew_availability_period">
<join-columns>
<join-column name="aircrew_availability_id"/>
</join-columns>
<inverse-join-columns>
<join-column name="period_id"/>
</inverse-join-columns>
</join-table>
<gedmo:versioned/>
</many-to-many>
</entity>
</doctrine-mapping>
期间实体:
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping">
<entity name="Mouke\Component\Application\Model\Period" table="TBL_period">
<id name="id" column="id" type="string" length="40">
<generator strategy="CUSTOM"/>
<custom-id-generator class="Mouke\Component\Resource\Doctrine\ORM\Id\Sha1IdGenerator"/>
</id>
<field name="startedAt" column="started_at" type="datetime"/>
<field name="endedAt" column="ended_at" type="datetime"/>
</entity>
</doctrine-mapping>
关于我的表格,这里是相关部分:
可用性表:
$builder->add('periods', CollectionType::class, [
'entry_type' => PeriodType::class,
'label' => 'Periods',
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'attr' => [
'class' => 'ajax-collection section-no-padding',
],
]);
期间形式:
$builder
->add('startedAt', DateTimePickerType::class, [
'label' => 'model.started_at',
'model_timezone' => $options['model_timezone'],
])
->add('endedAt', DateTimePickerType::class, [
'label' => 'model.ended_at',
'model_timezone' => $options['model_timezone'],
]);
棘手的部分:我可以从可用性中删除一个时间段,没问题。但是,如果可用性没有时间段,则它不会显示在我的日历中,因此您无法再对其进行编辑。不仅 "ghost entity" 可能会有我不想处理的副作用,而且 "delete periods" 删除整个可用性对用户来说也不友好,尤其是当你有一个巨大的 "Delete" 按钮在表格底部。
对这个问题有什么想法吗?
错过了 on-delete="CASCADE"
符号:
<join-table name="aircrew_availability_period">
<join-columns>
<join-column name="aircrew_availability_id" on-delete="CASCADE"/>
</join-columns>
<inverse-join-columns>
<join-column name="period_id" on-delete="CASCADE"/>
</inverse-join-columns>
</join-table>