CakePHP: Запрос на отсутствие связанной записи - PullRequest
0 голосов
/ 02 декабря 2011

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

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

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

Все это означает, что мне нужен способ отфильтровать приложенияв которой отсутствует запись в одной из таблиц, связанных с 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);
}

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

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

1 Ответ

0 голосов
/ 02 декабря 2011

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

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'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...