Невозможно удалить объект со многими связанными объектами, используя форму SF2 - PullRequest
0 голосов
/ 01 июня 2018

У меня есть система планирования деятельности, и я столкнулся с проблемой.Мой основной элемент называется AircrewAvailability и связан с элементом «Период» через отношение «многие ко многим» (период должен оставаться независимым, чтобы его могли использовать другие объекты без сохранения их идентификаторов).

Эта доступность отображается насистема FullCalendar: каждый период каждой доступности является событием в FullCalendar.При нажатии на FullCalendar мы получаем доступ к форме CRUD.

Создание и редактирование работают нормально, но удаление проблематично.Когда я пытаюсь удалить доступность, ORM пытается удалить период, но не касается таблицы отношений (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'],
        ]);

Сложная часть: я могу удалить период из доступности, нет проблем.Но если у доступности нет периода, она не отображается в моем календаре, поэтому вы больше не можете ее редактировать.Не только у «призрачной сущности» могут быть побочные эффекты, с которыми я не хочу иметь дело, но также не удобно «удалять периоды», чтобы удалить всю доступность, особенно если у вас есть огромная кнопка «Удалить» ввнизу формы.

Есть идеи по этому вопросу?

1 Ответ

0 голосов
/ 04 июня 2018

Пропущено обозначение 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>
...