首页 > 解决方案 > 将公司字段添加到后台的客户网格

问题描述

ps_address.company向客户网格添加一个新字段,工作。但是当我在客户网格中搜索 aps_customer.lastname时,会出现以下错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'lastname' in where clause is ambiguous

很清楚,我们知道 MySQL 不接受这个。但是 Doctorine 类的第一部分是在 PrestaShop 代码中定义的,我不知道在我的模块中在哪里更改它。

这是我尝试过的:

/**
 *  Add column `company`
 */
public function hookActionCustomerGridDefinitionModifier(array $params)
{
    /** @var GridDefinitionInterface $definition */
    $definition = $params['definition'];

    /** add/remove columns */
    $definition
        ->getColumns()
        ->remove('newsletter')
        ->remove('active')
        ->remove('optin')
        ->addAfter(
            'id_customer',
            (new DataColumn('company'))
                ->setName($this->trans('Company'))
                ->setOptions([
                    'field' => 'company',
                ])
        );

    /** apply filters to columns */
    $definition
        ->getFilters()
        ->add(
            (new Filter('company', TextType::class))
                ->setAssociatedColumn('company')
                ->setTypeOptions([
                    'required' => false,
                    'attr' => [
                        'placeholder' => $this->trans('Company', [], 'Admin.Actions'),
                ],
            ])
        );
}

/**
 * Hook allows to modify Customers query builder and add custom sql statements.
 *
 * @param array $params
 */
public function hookActionCustomerGridQueryBuilderModifier(array $params)
{
    /** @var QueryBuilder $searchQueryBuilder */
    $searchQueryBuilder = $params['search_query_builder'];

    /** @var CustomerFilters $searchCriteria */
    $searchCriteria = $params['search_criteria'];

    foreach ($searchCriteria->getFilters() as $filterName => $filterValue) {
        if ('company' === $filterName && $filterValue) {
            $searchQueryBuilder
                ->where('a.`company` = \'' . $filterValue . '\'')
                ->orWhere('a.`company` LIKE "%'.$filterValue.'%"');
            $searchQueryBuilder->setParameter(':s', $filterValue);
        }
    }

    $searchQueryBuilder->groupBy('c.`email`');

    $searchQueryBuilder->addSelect(
        'a.`company`',
        'a.`lastname` AS lastname'
    );

    $searchQueryBuilder->leftJoin(
        'c',
        '`' . pSQL(_DB_PREFIX_) . 'address`',
        'a',
        'a.`id_customer` = c.`id_customer`'
    );
}

我也尝试将$filterName我从->getFilters()from更改lastnamec.lastname,但那个 hack 也没有奏效。

我不应该更改 PrestaShop 核心代码,当然我也不想 ;-) 谢谢!

标签: prestashopprestashop-1.7dbal

解决方案


我知道这是一篇旧文章,但我写这篇文章只是为了那些可能像我一样通过改变来到这里的人。我不知道您使用的是哪个版本的 PrestaShop,但从 1.7.0 开始,我想您可以更改

$searchQueryBuilder->addSelect(
    'a.`company`',
    'a.`lastname` AS lastname'
);

在函数 hookActionCustomerGridQueryBuilderModifier 中

$searchQueryBuilder->addSelect(
    'a.`company`',
);

因为 Customer 类已经有 'lastname',所以你不应该再次将它添加到 select 子句中。


推荐阅读