Как обновить отношения 1:1 в Extbase

У меня есть 2 модели, как показано ниже

class Communication extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    /**
     * @var Filter
     */
    protected $filter;
}

class Filter extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    /**
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup>
     */
    protected $usergroup;
}

Шаблон как ниже

<f:form class="form-horizontal" name="communication" action="update" object="{communication}">
    <div class="form-group">
        <label class="col-xs-3 col-md-2 control-label" for="bodytext">{f:translate(key: 'text.usergroup')}</label>
        <div class="col-xs-9 col-md-10">
            <f:for each="{usergroups}" as="group">
                <label class="checkbox-inline">
                    <f:form.checkbox property="filter.usergroup" value="{group.uid}" /> {group.title}
                </label>
            </f:for>
        </div>
    </div>
    <div class="form-group">
        <div class="col-xs-9 col-md-10 col-xs-offset-3 col-md-offset-2">
            <button type="submit" class="btn btn-primary">{f:translate(key: 'button.update')}</button>
        </div>
    </div>
</f:form>

Когда я пытаюсь обновить сообщение с $this->communicationRepository->update($communication), он всегда создает новый фильтр, а не обновляет свой собственный. Почему это?

1 ответ

Решение

Это потому, что нет никакого отношения к фильтру, который уже там. Для сохранения фильтра нужно сказать, какой у него идентификатор. Я обнаружил, что это работает с полем __identity:

РЕДАКТИРОВАТЬ: вероятно, лучше обернуть поле с условием if, если нет установленного фильтра

<f:if condition="{communication.filter.uid}">
    <f:form.hidden name="communication[filter][__identity]" value="{communication.filter.uid}" />
</f:if>

Не уверен, но возможно, что это также работает с полем свойства uid:

<f:form.hidden property="filter.uid" />
Другие вопросы по тегам