CakePHP: запрос на отсутствие связанной записи

Я работаю над приложением CakePHP, которое, к примеру, является приложением для участия в университете. Он состоит из серии форм, каждый из которых хранится в таблице базы данных, а также несколько инструментов администрирования.

Связывание всех таблиц вместе представляет собой таблицу приложений, в которой хранятся метаданные приложения. Все различные таблицы, составляющие перспективное приложение для студентов, относятся к таблице приложений - другими словами, они разделяют отношения "один к одному".

Приложение позволяет людям уйти в середине его завершения и вернуться позже. Вследствие этого интерфейс администрирования становится загроможденным неполными приложениями. Пользователи интерфейса хотят видеть только незавершенные приложения, которые были выполнены до определенной точки. Информация, которую они хотят, поступает из полей требуемой формы в определенной таблице, поэтому, если человек выполнил этот шаг, будет представлена желаемая информация.

Все это говорит о том, что мне нужен способ отфильтровать приложения, которые не имеют записи в одной из таблиц, связанных с applications. Легкий способ сделать это - отфильтровать их после того, как они будут возвращены из базы данных, и действительно, это то, что я впервые попробовал. Но я не просто спрашиваю, я использую paginator, поэтому фильтрация набора результатов после его возврата испортит разбиение на страницы. Мне нужно отфильтровать его в параметре conditions массива конфигурации $paginate.

Вот соответствующий код контроллера, включая текущий механизм фильтрации, который работает, но беспорядок с разбиением на страницы:

var $paginate = array( 'limit'=>100, // We want apps that are complete at the top of the list, ordered by the date they were finished. // We want to order incomplete apps by dateStarted because they don't have a dateFinished yet. 'order'=>array('stepsCompleted'=>'desc', 'dateFinished'=>'desc', 'dateStarted'=>'desc'), );
function admin_index() { $this->Nsapp->recursive = 0; $this->Nsapp->unbindModel(array('hasOne'=>array('Essay', 'Religion', 'SpecialNeed')), false); $nsapps = $this->paginate('Nsapp'); // Filter out the apps that are too incomplete to do anything about foreach ($nsapps as $key => $nsapp) { // This fairly horrible conditional says, "If they provided us with at least one name and an email, do not filter them out" if ((empty($nsapp['Person']['name1']) && empty($nsapp['Person']['name2']) && empty($nsapp['Person']['surName'])) || empty($nsapp['Person']['email'])) { unset($nsapps[$key]); } } $this->set('nsapps', $nsapps);
}

Итак, суммируем и повторяем: мой текущий запрос на pagination возвращает массив пустых полей для связанных таблиц, у которых нет записи. Мне нужен способ удалить результаты, в которых отсутствует определенная связанная запись, а не пост-фильтрация (потому что это беспорядок с разбиением на страницы), но с параметром условий в массиве конфигурации $paginate, но я не знаю, как запросить отсутствие записи.

Заранее благодарю за любую помощь!

1 ответ

попробуйте установить фильтр при выполнении запроса к базе данных.

function admin_index() { $this->Nsapp->recursive = 0; $this->Nsapp->unbindModel(array('hasOne'=>array('Essay', 'Religion', 'SpecialNeed')), false); $nsapps = $this->paginate('Nsapp'); $this->paginate['Nsapp']['conditions'] = array("not"=>array("Person.name1"=>null, "Person.name2"=>null)); pr($this->paginate('Nsapp')); $this->set('nsapps', $this->paginate('Nsapp'));
}

licensed under cc by-sa 3.0 with attribution.