Как фильтровать связанные данные с помощью плагина FriendsOfCake Search для CakePHP 3.1.0

Плагин: FriendsOfCake\Search

CakePHP: 3.1.0

В настоящее время я добавляю возможность фильтровать мой контроллер заказов на index() метод. Мне нужно, чтобы я мог искать Заказы по моему имени пользователя, который разместил заказ. Каждый заказ связан с Users модель:

    $this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);

Когда я строю свой searchConfiguration() метод в OrdersTable.php У меня есть файл:

    ->value('first_name', [
'field' => $this->aliasField('Users.first_name')
])
->value('last_name', [
'field' => $this->aliasField('Users.last_name')
])

Индекс заказов ()

    $query = $this->Orders->find('search',
$this->Orders->filterParams($this->request->query))->contain(['Users', 'PaymentMethods', 'Industries']
)->order(['Orders.created' => 'DESC']);
$this->set('orders', $this->paginate($query));

Это нормально загружается, когда я не передаю какие-либо параметры в запрос, однако, как только я пытаюсь выполнить поиск по first_name или же last_name Я получаю ошибку:

Ошибка: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец ‘Orders.Users.first_name’ в ‘предложении where’

На основании ошибки добавляются заказы. в поле, которое я пытаюсь найти. Из того, что я могу сказать CakePHP имеет 2 метода aliasField() один в \var\www\<project_name>\vendors\cakephp\cakephp\src\ORM\Query.php

public function aliasField($field, $alias = null)
{
$namespaced = strpos($field, '.') !== false;
$aliasedField = $field;

if ($namespaced) {
list($alias, $field) = explode('.', $field);
}

if (!$alias) {
$alias = $this->repository()->alias();
}

$key = sprintf('%s__%s', $alias, $field);
if (!$namespaced) {
$aliasedField = $alias . '.' . $field;
}

return [$key => $aliasedField];
}

И один в \var\www\<project_name>\vendors\cakephp\cakephp\src\ORM\Table.php

public function aliasField($field)
{
return $this->alias() . '.' . $field;
}

Похоже, что Query.php позволит вам указать $alias однако для поля Table.php нет, поэтому я предполагаю, что этот метод используется здесь.

Может ли кто-нибудь дать мне руководство о том, как фильтровать данные, содержащиеся в связанной таблице?

0

Решение

Просто либо не пользуюсь aliasField() когда вы уже предоставляете псевдоним

'field' => 'Users.first_name'

или использовать aliasField() на связанный Users Таблица

'field' => $this->Users->target()->aliasField('first_name')

С помощью Query::aliasField() было бы совершенно неправильно, так как это вернет key => value массив для использования с Query::select(),

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]