Cakephp3: Как искать данные в paginate с условием содержания? - PullRequest
0 голосов
/ 08 декабря 2018

У меня две таблицы, имена разные и пользователи.В разных таблицах есть driver_id и vendor_id.Оба идентификатора в таблице пользователей с именем столбца идентификатора.Вот мой пример кода.

src / Model / Table / Miscellaneous.php

<?php

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;

    class MiscellaneousTable extends Table {

        public function initialize(array $config) {
            $this->table('miscellaneous');
            $this->displayField('name');
            $this->primaryKey('id');

            $this->addBehavior('Timestamp');
            $this->belongsTo('Vendors', [
                'foreignKey' => 'vendor_id',
                'className' => 'users',
                'joinType' => 'left'
            ]);
        $this->belongsTo('Drivers', [
                'foreignKey' => 'driver_id',
                'className' => 'users',
                'joinType' => 'left'
            ]);
        }
    }

Я хочу выполнить поиск по имени поставщика и имени драйвера.Вот мои условия пагинации:

if (!empty($this->request->data['vendor']['name'])) {
   $vendor_name = $this->request->data['vendor']['name'];
}
if (!empty($this->request->data['driver']['name'])) {
    $driver_name = $this->request->data['driver']['name'];
}
$miscellaneous = $this->paginate($this->Miscellaneous, ['contain' => ['Drivers' => function(\Cake\ORM\Query $q) {
    return $q->where(['Drivers.name LIKE ' => '%'.$driver_name.'%']);
    }, 'Vendors' => function(\Cake\ORM\Query $q) {
    return $q->where(['Vendors.name LIKE ' => '%'.$vendor_name.'%']);
    }], 'conditions' => $con, 'order' => ['Miscellaneous.id' => 'DESC']]);

Но это ничего не показывает.Пожалуйста, помогите мне найти правильные решения.Работает без указания имени поставщика и драйвера.

1 Ответ

0 голосов
/ 29 декабря 2018

для belongTo ассоциаций (которые Cake может обрабатывать с обычными объединениями). Я часто использую следующий фрагмент кода:

<?PHP
  $whereArray = [];
  if (!empty($this->request->data['vendor']['name'])) {
    $whereArray[] = ['Vendors.name LIKE ' => '%'.$this->request->data['vendor']['name'].'%'];
  }
  if (!empty($this->request->data['driver']['name'])) {
    $whereArray[] = ['Drivers.name LIKE ' => '%'.$this->request->data['driver']['name'].'%'];
  }
  $miscellaneous = $this->paginate($this->Miscellaneous->find('all', ['contain' => ['Vendors', 'Drivers']])->where($whereArray)->order(['Miscellaneous.id' => 'DESC']);

?>

Аннотация: Я часто использую "all" в качестве поиска, потому что мне нужны полные записитакже в списках ...

...