Typo3 Error: The ColumnMap for property is missing (m:n)

Typo3 Error: The ColumnMap for property is missing (m:n)

我遇到了与此处发布的相同问题:

...除了我使用的是 m:n 关系 table。不幸的是我的错误继续存在:

我使用的是 Typo3 8.7.19 版,我正在开发一个扩展。两个 tables "mitarbeiter" 和 "zusatzlich" 是具有 m:n 关系的连接体。我尝试在 "mitarbeiter" 的存储库中搜索 table "zusatzlich" 中的字段。两者的关系是必要的。

如果我尝试执行以下查询,我会收到错误 "The ColumnMap for property "tx_khsjmitarbeiter_domain_model_zusatzlich" of class "...\Mitarbeiter" is missing."

    $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();

包含"zusatzlich"的UID的"mitarbeiter"字段"connection_id"的相关TCA代码:

'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无效 */ public 函数 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;
}

我可以在 BE 中添加新的 zusatz 项目并将其应用于任何 mitarbeiter 项目,因此我相信它在这方面的设置是正确的。 但是我也注意到,如果我更改此行:

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

...到此...

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

我在引用 ANYTHINGATALL 而不是 tx_khsjmitarbeiter_domain_model_zusatzlich

时遇到同样的错误

谁能指出我正确的方向?

您需要提供在 TCA 中描述为约束运算符的 属性,而不是 table 列。据我所知,您的查询约束应该是:

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

引导我走向正确的方向,但缺少相关模型“zusatzlich”的 属性。因此它应该是:

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

如果您的关系在 TCA 中正确定义,它将被转换为具有正确 table 名称的 SQL LeftJoin。

如果 属性 带有下划线(例如 zusatz_xy),小驼峰式版本也可以使用 (zusatzXy)。