Плагин поиска Cakephp для поиска внешнего ключа - PullRequest
0 голосов
/ 19 октября 2019

Я использую плагин friendsOfCake / search с CakePHP 3.8.

У меня есть две таблицы, которым нравится

Strains

Name    | user_id
-----------------
Strain1 | 1
Strain2 | 1
Strain3 | 2

Пользователи

Name    | id
-----------------
Peter   | 1
Max     | 2

, где Strains.user_id относится к столбцам id в таблице Users.
Я хочу создать маску поиска, гдеЯ могу искать имя пользователя, и результатом должен быть список штаммов, которые были созданы этим пользователем. Например, если я введу «Питер», результатом будут «Strain1» и «Strain2».

Согласно https://github.com/FriendsOfCake/search/tree/master/docs#options я написал следующий код

StrainsTable.php

public function initialize(array $config)
{
    parent::initialize($config);
    $this->addBehavior('Search.Search');

    $this->searchManager()
        ->value ('user_id')
        ->like ('q', [ // q is the name of the input field in the view
            'fields' => ['Users.name'],
            'beforeProcess' => function (\Cake\ORM\Query $query, array $args, \Search\Model\Filter\Base $filter) {
                $query->contain('Users');
            },
        ]);

    ...
}

StrainsController.php

public function index()
{
    $query = $this->Strains
    ->find ('search', ['search' => $this->request->getQueryParams()]);
    debug($query);
    $this->set('strains', $this->paginate($query));
}

Я получаю сообщение об ошибке Ошибка: SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'Strains.q' в 'выражении where'

Созданный SQL-запрос - это
SELECT Strains.name AS `Strains__name`, Strains.user_id AS `Strains__user_id`, Users.id AS `Users__id`, Users.name AS `Users__name` FROM strains Strains INNER JOIN users Users ON Users.id = (Strains.user_id) WHERE Strains.q like :c0
, где c0 - значение q.

Я рад любой помощи.

1 Ответ

1 голос
/ 19 октября 2019

Наконец, я нашел решение: нужно сопоставить входной запрос q со столбцом Users.name, используя field (вместо fields), а для указания внешнего ключа используется проба fields.

 $this->searchManager()
    ->value ('user_id')
    ->like ('q', [ // q is the name of the input field in the view
        'field' => ['Users.name']
        'fields' => ['user_id'],
        'beforeProcess' => function (\Cake\ORM\Query $query, array $args, \Search\Model\Filter\Base $filter) {
            $query->contain('Users');
        },
    ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...