условия фильтра из ассоциации

У меня есть функция поиска, которая отлично работает для персонала, так что я могу искать по имени. Теперь я хочу отфильтровать персонал по staffgroup.groupname, но, к сожалению, я получаю эту ошибку:

Column not found: 1054 Unknown column 'staffgroups.groupname' in 'where clause'

У меня есть следующая таблица

  • посохи (человек может принадлежать ко многим группам)
  • staff_staffgroups (таблица связи HABTM)
  • staffgroups (имеет название группы)

я использовал следующие условия:

$tmpConditions['AND'][] = array('Staff.isActive =' => "1");
$tmpConditions['OR'][] =  array('Staff.lastname LIKE' => "%$name%");
$tmpConditions['OR'][] = array('staffgroups.groupname LIKE' => "%$group%");
[...]

$this->Staff->recursive = 1;
$this->paginate = array('conditions' =>  $tmpConditions );
$this->set('staffs', $this->paginate());

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

ура эндо


person endo.anaconda    schedule 28.01.2013    source источник


Ответы (4)


$tmpConditions['OR'][] = array('staffgroups.groupname LIKE' => "%$group%");

Не следует соглашениям CakePHP. Должен быть:

$tmpConditions['OR'][] = array('StaffGroup.group_name LIKE' => "%$group%");

Соглашения о модели и базе данных:

Модели:

Имена классов моделей в единственном числе и CamelCased. Person, BigPerson и ReallyBigPerson — все это примеры обычных имен моделей.

Таблицы базы данных:

Имена таблиц, соответствующие моделям CakePHP, указаны во множественном числе и подчеркнуты. Базовыми таблицами для вышеупомянутых моделей будут люди, большие_люди и действительно_большие_люди соответственно.

Поля базы данных:

Имена полей, состоящие из двух или более слов, подчеркиваются, например, first_name.

Следуя этим соглашениям, у вас должна быть таблица с именем staff_groups, которая содержит поле с именем group_name. Связанная модель будет называться StaffGroup.

person Jelmer    schedule 28.01.2013
comment
Можете ли вы обновить свой вопрос? Пожалуйста, добавьте свой вопрос вместо того, чтобы редактировать исходные строки. Не могли бы вы также уточнить, как выглядит ваша структура базы данных? Можете ли вы получить доступ к другим данным? Что происходит, когда вы просто var_dump($this->StaffGroup->find('all'); ? - person Jelmer; 28.01.2013
comment
я повторю mvc и вернусь к вам - person endo.anaconda; 29.01.2013

Вы не можете сделать это «из коробки» из-за ассоциации HABTM. Вы должны сделать это вручную.

Сначала вам нужно получить искомые StaffGroup.id.

$group_ids = $this->Staff->StaffGroup->field('id', array('groupname LIKE' => '%$group%') );

Затем отвяжите ассоциацию HABTM, а затем привяжите таблицу соединений как ассоциацию hasMany.

$this->Staff->UnbindModel( array('hasAndBelongsToMany' => array('StaffGroup')) );
$this->Staff->bindModel(array('hasMany' => array('StaffStaffGroup')));

Теперь вы можете выполнить поиск

$this->Staff->StaffStaffGroup->find(
    'all', 
    array(
        'conditions' => array(
            'StaffStaffGroup.staff_group_id' => $group_ids,
            'Staff.isActive =' => "1",
            'Staff.lastname LIKE' => "%$name%",
        )
    )
);
person kaklon    schedule 29.01.2013
comment
очень жаль, что это не из коробки, я попробую., в конце это все еще не работало, хотя я получил все условности - person endo.anaconda; 29.01.2013
comment
я задаю дополнительный вопрос: stackoverflow.com/questions/ 14691452/ - person endo.anaconda; 05.02.2013

В вашем массиве $tmpConditions у вас должен быть следующий формат:

$tmpConditions = array(
       "AND" => array('Staff.isActive =' => "1"),
       "OR"  => array(
                'Staff.lastname LIKE' => "%$name%",
                'Staffgroup.groupname LIKE' => "%$group%"
       )
);

Я предполагаю, что у вас есть таблица с именем staffgroups и что она фактически содержит поле groupname.

Также линия

$this->Staff->recursive = 1;

должно быть

$this->paginate = array(
      ...
      'recursive' => 1
);

Я считаю, что это должно сделать работу...

person Cris Sawfish    schedule 28.01.2013
comment
Я не понимаю, почему recursive должен быть внутри разбивки на страницы, а не устанавливаться сам по себе, оба должны работать. - person Yoggi; 28.01.2013
comment
Это прямо из документации [book .cakephp.org/2.0/en/core-libraries/components/ - person Cris Sawfish; 28.01.2013
comment
а где в документации написано, что $this->Staff->recursive = 1; неправильно? - person Yoggi; 28.01.2013
comment
В разделе Настройка запроса явно говорит, что recursive, а также другие параметры, связанные с Model->find('all'), передаются в модель с разбивкой на страницы через массив настроек paginate. Поэтому я считаю, что это подразумевает ваш ответ - person Cris Sawfish; 28.01.2013
comment
Да, вы можете передать его через массив страниц, но все же вам это не нужно. То же самое и с условным массивом для поисковых запросов в CakePHP. Вы все еще можете вызвать модель с помощью $this->Staff->recursive = 1;. Это правильно и будет работать. Попробуйте сами, и вы увидите, что это работает! - person Yoggi; 28.01.2013

Просто измените staffgroups на Staffgroup. Соглашения об именах для моделей и таблиц означают, что таблица базы данных my_tables будет называться моделью MyTable. См. http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions.

person Yoggi    schedule 28.01.2013