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

Плагин: FriendsOfCake/Search

CakePHP: 3.1.4

Я использую плагин для фильтрации данных моего index.ctp с помощью формы.
Это похожий вопрос:
Как отфильтровать связанные данные
о принадлежности к ассоциации. Мой вопрос касается именно связанных данных HABTM, где моя связанная таблица связана через joinTable, а не напрямую. Обычная настройка в модели, подобная следующей, в этом случае не работает:

->value('painting', [
field' => $this->Paintings->target()->aliasField('id')
)]

Мои таблицы настроены так:

  • Билеты belongsToMany Картины
  • Картины belongsToMany Билеты
  • с joinTable tickets_paintings

Вот основная настройка:

class TicketsTable extends Table
{
public function initialize(array $config)
{
...

$this->belongsToMany('Paintings', [
'foreignKey' => 'ticket_id',
'targetForeignKey' => 'painting_id',
'joinTable' => 'tickets_paintings'
]);
}

public function searchConfiguration()
{
$search = new Manager($this);

$search->value('status', [
'field' => $this->aliasField('active'),
])->like('member_name', [
'field' => $this->Members->target()->aliasField('surname'),
'filterEmpty' => true
])->value('painting', [
'field' => $this->Paintings->target()->aliasField('id'),  // not working
]);

return $search;

}
class TicketsController extends AppController
{
public function index()
{
$query = $this->Tickets
->find('search',
$this->Tickets->filterParams($this->request->query))
->contain(['Members', 'Paintings', 'Appointments']);

...
}

Все остальное работает, и параметры добавляются в URL при фильтрации и т. Д., Поэтому я добавляю только те части, в которых sth должен быть неправильным.

После фильтрации я получаю сообщение об ошибке:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Paintings.id' in 'where clause'

содержать работает правильно только при отображении данных из таблицы Paintings в представлении Tickets.

Но в коде из запроса SQL я вижу, что все содержащиеся в нем таблицы (члены, назначения) объединяются для запроса Кроме таблица Paintings, поэтому, очевидно, он не может найти столбец … И я думаю, что он не может присоединиться к нему напрямую, так как они связаны только через joinTable.

Я новичок в CakePHP и не могу понять, что я делаю здесь неправильно, так что, надеюсь, кто-нибудь может мне помочь.

Нужно ли использовать другой синтаксис в настройках плагина? Должен ли я настроить свои таблицы по-другому? Или как именно я могу сказать запросу включить таблицу, связанную с habtm, в поиск?

Спасибо!

1

Решение

Доступные методы поиска зависят от поля, доступного в основном запросе (hasMany а также belongsToMany ассоциации извлекаются в отдельных запросах).

Хотя вы можете присоединить его вручную в контроллере, используя callback— или finder-Filter, вероятно, лучший подход, так как вы можете изменить запрос на уровне модели, и вы можете легко использовать Query::matching() фильтровать по связанным данным.

Вот (непроверенный) пример, который должен дать вам подсказку:

use Cake\ORM\Query;
use Search\Type\Callback; // This changed in master recently
// now it's Search\Model\Filter\Callback

// ...

public function searchConfiguration()
{
$search = new Manager($this);

$search
// ...
->callback('painting', [
'callback' => function (Query $query, array $args, Callback $type) {
return $query
->distinct($this->aliasField('id'))
->matching('Paintings', function (Query $query) use ($args) {
return $query
->where([
$this->Paintings->target()->aliasField('id') => $args['painting']
]);
});
}
]);

return $search;

}

Смотрите также

2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector