#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 сохраняется только на одной стороне отношения.