Я добавил пользовательский столбец в сетку администратора, вот так
<column name="customer_name" class="Vendor\Module\Ui\Component\Listing\Columns\CustomerName">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="editor" xsi:type="string">text</item>
<item name="sortable" xsi:type="string">true</item>
<item name="label" xsi:type="string" translate="true">Customer Name</item>
<item name="sortOrder" xsi:type="number">30</item>
</item>
</argument>
</column>
В моем классе CustomerName я создаю значения для этого столбца:
public function prepareDataSource(array $dataSource)
{
$fieldName = $this->getData('name');
foreach ($dataSource['data']['items'] as & $item) {
$customer = $this->customerRepository->getById($item['customer_id']);
$name = $customer ? $customer->getFirstName().' <'.$customer->getEmail().'>' : '';
$item[$fieldName] = $name;
}
return $dataSource;
}
Это показывает в сетке, как и ожидалось. Но когда я пытаюсь отсортировать по этому столбцу или фильтру - происходит ошибка
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'customer_name' in 'order clause'
Как я могу это исправить?
ОБНОВИТЬ
Теперь я пытаюсь решить эту проблему, удалив класс CustomerName (и удалите ссылку на него в теге column в xml), и вместо этого я добавил функцию _renderFiltersBefore () в мой класс коллекции
protected function _renderFiltersBefore() {
$joinTable = $this->getTable('customer_entity');
$this->getSelect()->join($joinTable.' as customer_entity','main_table.customer_id = customer_entity.entity_id', array('*'));
$this->getSelect()->columns('CONCAT(firstname," <",email,">") as customer_name');
parent::_renderFiltersBefore();
}
Теперь сортировка работает, а фильтрация - нет (появляется та же ошибка)
Это заняло некоторое время, но я понял это
В моем листинге xml:
В Vendor \ Module \ Model \ ResourceModel \ SomeCustomModel \ Grid:
В Vendor \ Module \ Model \ ResourceModel \ SomeCustomModel
источник