Ошибка Typo3: отсутствует карта ColumnMap для свойства (m: n)

У меня та же проблема, что была здесь:

Ошибка Typo3: отсутствует карта ColumnMap для свойства

... за исключением того, что я использую реляционную таблицу m: n. К сожалению, моя ошибка продолжается:

Я использую Typo3 версии 8.7.19 и разрабатываю расширение. Две таблицы «mitarbeiter» и «zusatzlich» связаны отношением m: n. Я пытаюсь найти поле в таблице «zusatzlich» в хранилище «mitarbeiter». Связь обоих необходима.

Если я попытаюсь выполнить следующий запрос, я получаю сообщение об ошибке «ColumnMap для свойства« tx_khsjmitarbeiter_domain_model_zusatzlich »класса« ... \ Mitarbeiter »отсутствует».

    $query =  $this->createQuery();

    $zu = [];

    if($zusatz1 != ""){
        $zu[] = $query->equals('tx_khsjmitarbeiter_domain_model_zusatzlich.zusatz', $zusatz1);
    }

    if(count($zu)>0){
        $query->matching($query->logicalAnd( $zu ));
    }

    return $query->execute();

Соответствующий код TCA поля «connection_id» в «mitarbeiter», который содержит UID «zusatzlich»:

'connection_id' => [
        'exclude' => true,
        'label' => 'LLL:EXT:khsj_mitarbeiter/Resources/Private/Language/locallang_db.xlf:tx_khsjmitarbeiter_domain_model_mitarbeiter.connection_id',
        'config' => [
            'type' => 'select',
            'renderType' => 'selectCheckBox',
            'foreign_table' => 'tx_khsjmitarbeiter_domain_model_zusatzlich',
            'MM' => 'tx_khsjmitarbeiter_mitarbeiter_zusatzlich_mm',
        ],

    ],

Это объектная модель:

/**
 * connectionId
 *
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\..\Model\Zusatzlich>
 * @cascade remove
 */
protected $connectionId = null;


/**
 * Initializes all ObjectStorage properties
 * Do not modify this method!
 * It will be rewritten on each save in the extension builder
 * You may modify the constructor of this class instead
 *
 * @return void
 */
protected function initStorageObjects()
{
    $this->connectionId = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}

/ ** * Добавляет Zusatzlich * * @param .. \ Model \ Zusatzlich $ connectionId * @return void * / public function addConnectionId (.. \ Model \ Zusatzlich $ connectionId) {$ this-> connectionId-> attach ($ connectionId ); }

/**
 * Removes a Zusatzlich
 *
 * @param \..\Model\Zusatzlich $connectionIdToRemove The Zusatzlich to be removed
 * @return void
 */
public function removeConnectionId(\..\Model\Zusatzlich $connectionIdToRemove)
{
    $this->connectionId->detach($connectionIdToRemove);
}

/**
 * Returns the connectionId
 *
 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\..\Model\Zusatzlich> connectionId
 */
public function getConnectionId()
{
    return $this->connectionId;
}

/**
 * Sets the connectionId
 *
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\..\Model\Zusatzlich> $connectionId
 * @return void
 */
public function setConnectionId(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $connectionId)
{
    $this->connectionId = $connectionId;
}

Я могу добавлять и применять новые элементы zusatz в BE к любому элементу mitarbeiter, поэтому я уверен, что он настроен правильно в этом отношении. Однако я также заметил, что если я изменю эту строку:

$zu[] = $query->equals('tx_khsjmitarbeiter_domain_model_zusatzlich.zusatz', $zusatz1);

...к этому...

$zu[] = $query->equals('ANYTHINGATALL.zusatz', $zusatz1);

Я получаю ту же ошибку, ссылаясь на ANYTHINGATALL вместо tx_khsjmitarbeiter_domain_model_zusatzlich

Может ли кто-нибудь указать мне правильное направление?


person James    schedule 19.09.2018    source источник


Ответы (2)


Ответ j4k3 привел меня в правильное направление, но отсутствует свойство связанной модели «zusatzlich». Таким образом должно быть:

if ($zusatz1 != "") {
    $zu[] = $query->contains('connection_id.zusatz', $zusatz1);
}

Он будет преобразован в SQL LeftJoin с правильными именами таблиц, если ваши отношения правильно определены в TCA.

В случае свойства с подчеркиванием (например, zusatz_xy), версия lowerCamelCase также будет работать (zusatzXy).

person clive beckett    schedule 09.01.2020

Вам необходимо предоставить свойство, описанное в TCA как оператор ограничения, а не столбец таблицы. Насколько я могу судить, ограничение вашего запроса должно быть:

if($zusatz1 != ""){
        $zu[] = $query->contains('connection_id', $zusatz1);
}
person j4k3    schedule 02.10.2018