过滤关联条件

时间:2013-01-28 13:19:31

标签: cakephp foreign-keys conditional-statements model-associations

我有一个搜索功能,对员工很有用,所以我可以按名称搜索。 现在,我想通过staffgroup.groupname过滤员工,但不幸的是我收到了这个错误:

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

我正在使用以下tablelayout

  • 员工(一个人可以属于许多团体)
  • staff_staffgroups(HABTM-linking table)
  • 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());

我无法让它工作,尽管我认为条件设定正确。

欢呼endo

4 个答案:

答案 0 :(得分:1)

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

不遵循CakePHP conventions。它应该是:

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

Model and Database conventions

型号:

  

模型类名是单数和CamelCased。 Person,BigPerson和ReallyBigPerson都是传统模型名称的例子。

数据库表:

  

与CakePHP模型对应的表名称是复数并加以强调。上述模型的基础表分别是people,big_people和really_big_people。

数据库字段:

  

带有两个或更多单词的字段名称被强调,如first_name。

遵循这些约定,您应该有一个名为staff_groups的表,其中包含一个名为group_name的字段。关联的模型将命名为StaffGroup

答案 1 :(得分:1)

由于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%",
        )
    )
);

答案 2 :(得分:0)

$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
);

我相信这应该可以胜任......

答案 3 :(得分:0)

只需将staffgroups更改为Staffgroup即可。模型与表的命名约定意味着db table my_tables将命名为model MyTable。请参阅http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventions