TYPO3:如何为逗号分隔值字段设置约束?

时间:2018-06-08 11:48:15

标签: mysql typo3-8.7.x

我对单个数据库查询有些麻烦,希望你能帮助我:)。在当前项目中,存在多个彼此相关的模型。我的问题的相关模型是:Product和AttributeSet,每个产品都可以拥有n-AttributSets。

如果我查看数据库表,那么我可以看到类似的东西:

Product:

uid | attribute_sets | ...
---------------------------
101 | 15             | ...
...

AttributeSet:

uid | name | product | list_value | ...
----------------------------------------
600 | a    | 101     | 6,59,102   | ...
665 | b    | 101     | 3,12,79    | ...
...

此外,我想通过list_value过滤产品。据我所知,单个TYPO3内置的数据库查询函数(例如“in”,“contains”等)是不可能的,因为这种关系通常应该用m:n-relations完成,但我不能为此更改项目。所以我试图结合一些查询约束来实现这个目的:

public function findProductsExample()
{
    $query = $this->createQuery();
    $query->getQuerySettings()->setRespectStoragePage(false);
    $query->getQuerySettings()->setIgnoreEnableFields(false);
    $query->matching(
        $query->logicalAnd(
            [
                $query->equals('deleted', 0),
                $query->logicalAnd(
                    [
                        $query->logicalOr(
                            [
                                $query->like('attributeSets.listValue', '\'6,%\''),
                                $query->like('attributeSets.listValue', '\'%,6,%\''),
                                $query->like('attributeSets.listValue', '\'%,6\''),
                            ]
                        ),
                        $query->logicalOr(
                            [
                                $query->like('attributeSets.listValue', '\'59,%\''),
                                $query->like('attributeSets.listValue', '\'%,59,%\''),
                                $query->like('attributeSets.listValue', '\'%,59\''),
                            ]
                        ),
                    ]
                )
            ]
        )
    );

    return $query->execute()->toArray();
}

在此测试用例中,我尝试在其中一个属性集的list_value字段中查找包含值6和59的所有产品,但此测试的查询结果始终为空:(。

所以我已经开始调试生成的SQL并得到类似的东西(不相关的东西被删除):

SELECT `tx_vic_domain_model_product`.*
FROM `tx_vic_domain_model_product` `tx_vic_domain_model_product`
LEFT JOIN `tx_vic_domain_model_attributeset` `tx_vic_domain_model_attributeset`
ON `tx_vic_domain_model_product`.`uid` = `tx_vic_domain_model_attributeset`.`product`
WHERE ((`tx_vic_domain_model_product`.`deleted` = 0)
AND ((((`tx_vic_domain_model_attributeset`.`list_value` LIKE '6,%')
OR (`tx_vic_domain_model_attributeset`.`list_value` LIKE '%,6,%'))
OR (`tx_vic_domain_model_attributeset`.`list_value` LIKE '%,6'))
AND (((`tx_vic_domain_model_attributeset`.`list_value` LIKE '59,%')
OR (`tx_vic_domain_model_attributeset`.`list_value` LIKE '%,59,%'))
OR (`tx_vic_domain_model_attributeset`.`list_value` LIKE '%,59'))))...

此外,我也通过mysql cli和phpmyadmin解雇了这个生成的查询。在这两种情况下,我从MySQL获得了非空结果,因此生成的查询似乎是正确的,但为什么存储库的查询结果为空,我该如何解决这个问题?

0 个答案:

没有答案