2016-12-26 6 views
0

Я создаю расширение с таблицей для элементов, это могут быть либо проекты, либо объекты, а проект - контейнер для множества объектов.Ограничение репозитория 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 таблице вызывает ошибку ...

ответ

0

Это, в моем oppinion, случай для пользовательского запроса. Нижеследующее должно предоставить вам объекты, на которые не ссылаются, из вашей таблицы mm:

$query = $this->createQuery(); 
$query->statement(' 
    SELECT * 
    FROM tx_myext_domain_model_item 
    WHERE uid NOT IN(
     SELECT foreign_uid FROM tx_myext_item_object_mm 
    ) 
'); 
$query->execute();