TYPO3 Extbase: обратное соотношение 1: 1

#typo3 #extbase

#typo3 #extbase

Вопрос:

Возможно ли инвертировать отношение 1: 1 без добавления второго поля в БД в Extbase?

Пример: расширение имеет контактных лиц, которые могут иметь fe_user . Модель домена контактного лица является сайтом-владельцем отношения.

Модель домена

Теперь вы можете использовать $contactPerson->getFrontendUser();

Есть ли какой-либо способ добавить свойство inversed к интерфейсному пользователю, не добавляя его в БД?
Таким образом, вы можете использовать $frontendUser->getContactPerson()
или, что еще более важно: $frontendUserRepository->findByContactPerson() ;


Я попытался добавить свойство в интерфейсную пользовательскую модель:

 /**
 * FrontendUser
 */
class FrontendUser extends TYPO3CMSExtbaseDomainModelFrontendUser
{

    /**
     * @var VendorExtKeyDomainModelContactPerson
     */
    protected $contactPerson = null;
}
  

И переопределение TCA fe_users:

 $GLOBALS['TCA']['fe_users']['columns']['contact_person'] = array(
    'exclude' => 1,
    'label' => 'LLL:EXT:ExtKey/Resources/Private/Language/locallang_db.xlf:tx_ExtKey_domain_model_contactperson',
    'config' => array(
        'type' => 'inline',
        'foreign_table' => 'tx_ExtKey_domain_model_contactperson',
        'foreign_field' => 'frontend_user',
        'minitems' => 0,
        'maxitems' => 1,
    ),
);
  

Но когда я вызываю:

 /**
 * The repository for Customers
 */
class FrontendUserRepository extends TYPO3CMSExtbaseDomainRepositoryFrontendUserRepository
{
    /**
     * @param VendorExtKeyDomainModelContactPerson $contactPerson
     * @param boolean $ignoreEnableFields
     * @param boolean $respectStoragePage
     * @return object
     */
    public function findByContactPerson(ContactPerson $contactPerson, $ignoreEnableFields = false, $respectStoragePage = true){
        $query = $this->createQuery();
        $query->getQuerySettings()
            ->setIgnoreEnableFields($ignoreEnableFields)
            ->setRespectStoragePage($respectStoragePage);

        $query->matching($query->equals('contactPerson', $contactPerson));
        return $query->execute()->getFirst();
    }
}
  

Это создает следующую SQL-ошибку:

Неизвестный столбец ‘fe_users.contact_person’ в предложении ‘where’

Ответ №1:

Вычисляемые двунаправленные отношения 1: 1 не поддерживаются в TYPO3, только отношения m: n поддерживают это с дополнительным определением в TCA, что также требует дополнительного поля на противоположном сайте отношения.

Что касается вашего сценария, вам необходимо самостоятельно создать дополнительное свойство и поле базы данных в расширенной FrontendUser модели предметной области.

Ответ №2:

Существует возможность, подобная описанной здесь: http://www.oliver-weiss.com/blog/einzelansicht/article/relationen-in-typo3-teil-1-11-relation/News/detail / . Кроме того, вместо того, чтобы иметь «встроенное» отношение с обеих сторон, это также работает, если только одна сторона является «встроенной», а другая сторона — «select». Но для единственного (инвертированного) «встроенного» отношения должно быть определено «foreign_field». После этого «чужой» uid сохраняется только на одной стороне отношения.