Typo3错误:缺少属性的ColumnMap(m:n)

时间:2018-09-19 13:40:20

标签: extbase typo3-extensions

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

Typo3 Error: The ColumnMap for property is missing

...除了我使用的是m:n关系表。不幸的是,我的错误仍然存​​在:

我正在使用Typo3版本8.7.19,并且正在开发扩展。两个表“ mitarbeiter”和“ zusatzlich”是具有m:n关系的连接。我尝试在“ mitarbeiter”存储库中的“ zusatzlich”表中搜索字段。两者之间的关系是必须的。

如果我尝试执行以下查询,则会收到错误“类“ ... \ Mitarbeiter”的属性“ tx_khsjmitarbeiter_domain_model_zusatzlich”的ColumnMap丢失。“

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

“ mitarbeiter”中“ connection_id”字段的相关TCA代码,其中包含“ zusatzlich”的UID:

'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      * @返回无效      * /     公共函数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时遇到相同的错误

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

j4k3’s answer使我朝着正确的方向前进,但缺少相关模型“ zusatzlich”的属性。因此应该是:

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

只要您的关系在TCA中已正确定义,它将转换为具有正确表名的SQL LeftJoin。

如果属性带有下划线(例如zusatz_xy),则LowerCamelCase版本也可以使用(zusatzXy)。