Плагин: FriendsOfCake\Search
CakePHP: 3.1.0
В настоящее время я добавляю возможность фильтровать мой контроллер Orders по методу index()
. Мне нужно иметь возможность искать Заказы на мое имя Пользователя, разместившего заказ. Каждый заказ связан с моделью Users
:
$this->belongsTo('Users', [ 'foreignKey' => 'user_id', 'joinType' => 'INNER' ]);
Когда я searchConfiguration()
свой searchConfiguration()
в файле OrdersTable.php
меня есть следующее:
->value('first_name', [ 'field' => $this->aliasField('Users.first_name') ]) ->value('last_name', [ 'field' => $this->aliasField('Users.last_name') ])
Метод index ()
$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 clause'
Исходя из этой ошибки, она добавляет ордеры. в поле, которое я пытаюсь выполнить. Из того, что я могу сказать, 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 этого не делает, поэтому я предполагаю, что это метод, который используется здесь.
Может ли кто-нибудь дать мне рекомендации относительно того, как фильтровать данные, содержащиеся в связанной таблице?
Просто не используйте aliasField()
когда вы уже поставляете псевдоним
'field' => 'Users.first_name'
или используйте aliasField()
в соответствующей таблице Users
'field' => $this->Users->target()->aliasField('first_name')
Использование Query::aliasField()
было бы совершенно неправильным, так как это вернет массив key => value
для использования с Query::select()
.