Я создаю расширение с таблицей для элементов, это могут быть либо проекты, либо объекты, а проект - контейнер для множества объектов.Ограничение репозитория TYPO3 Extbase с отношением MM
Для отличия флажок используется для обозначения элемента как проекта, и при установке этого флажка отображается необязательное поле. Это поле является отношением (m: n) от проекта к содержащимся в нем объектам (той же таблице). Множество бок о бок выбирает только не проекты и объекты, еще не назначенные проекту через foreign_table_where
.
Это поле имеет следующие TCA:
'objects' => [
'displayCond' => 'FIELD:isproject:=:1',
'exclude' => 0,
'label' => $ll . 'tx_myext_domain_model_item.objects',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'foreign_table' => 'tx_myext_domain_model_item',
'foreign_table_where' => 'AND isproject = 0 AND tx_myext_domain_model_item.uid NOT IN (SELECT uid_foreign FROM tx_myext_item_object_mm WHERE uid_local != ###THIS_UID###)',
'MM' => 'tx_myext_item_object_mm',
'size' => 10,
'autoSizeMax' => 30,
'maxitems' => 9999,
'multiple' => 0
],
],
с моим плагином я даю возможность (корыто Flexform), чтобы выбрать, чтобы отобразить только те объекты, только проекты, или оба, сделанные с помощью следующего кода в репозитории:
public function findList($entryInclude = 'objects_only') {
/** @var \TYPO3\CMS\Extbase\Persistence\Generic\Query $query */
$query = $this->createQuery();
switch ($entryInclude) {
case 'projects_objects':
$foreign_uids = $this->createQuery()
->statement('SELECT uid_foreign FROM tx_myext_item_object_mm')
->execute();
$constraints = [
$query->equals('isproject', 1),
$query->logicalNot($query->in('uid', $foreign_uids))
];
break;
case 'projects_only':
$constraints = $query->equals('isproject', 1);
break;
default:
$constraints = $query->equals('isproject', 0);
break;
}
$query->matching($query->logicalAnd($constraints));
return $query->execute();
}
усилие, чтобы создать массив всех uid_foreign
, найденных в tx_myext_item_object_mm
таблице вызывает ошибку ...