5

序言:几天前我问了一个解决HABTM过滤器的问题,即使有教程我也无法做到,所以“Obi Kwan Kenobi 你是我唯一的希望”。

我想要实现的目标:按在 StaffStaffgroup 中使用的 GroupID 过滤员工

我有以下表格布局

  • 员工(一个人可以属于多个组)
  • staff_staffgroups(HABTM 链接表)
  • staffgroups(有组名)

变量 $tmp 为我提供了一个工作数组,但问题是 Staff 是 StaffStaffgroups 的子对象。我可以解析并重新组装一个数组,但这不是一个好的解决方案。所以我想在 Staff 上使用条件(参见注释行),但随后出现错误 1054“未找到列:1054 未知列”。我尝试绑定和取消绑定,但没有结果。

$group_id = 2;
$tmp = $this->Staff->StaffStaffgroup->find('all',
        array('conditions' => array(
            'StaffStaffgroup.staffgroup_id' => $group_id,
            'Staff.isActive =' => "1",
            'Staff.last_name LIKE' => "%$name%",
            )
         )
);

debug($tmp);

//$tmpConditions['AND'][] = array('StaffStaffgroup.staffgroup_id' => $group_ids);

编辑:

我尝试了条件和可控制的行为,但不幸的是它根本没有过滤任何东西

    $this->Staff->contain(array('StaffStaffgroup'));
    $this->paginate = array('StaffStaffgroup' =>array(
                                    array('conditions'  => array(
                                            'StaffStaffgroup.staffgroup_id' => '2'
                                        )
                                    )
                                )
    );
  • 我添加到所有模型中: public $actsAs = array('Containable');
  • 我也尝试了内部连接,但没有过滤:

     $this->paginate = array( 
     'conditions' => array('StaffStaffgroup.staffgroup_id' => 2 ),
     'joins' => array(
        array(
            'alias' => 'StaffStaffgroup',
            'table' => 'staff_staffgroups',
            'type' => 'INNER',
            'conditions' => 'StaffGroup_id = StaffStaffgroup.staffgroup_id'
        )
     )
    

    );

4

3 回答 3

5

您不能为此使用 Containable 行为。签出 sql 转储,您将看到查询已完成。

我会分两步做

从 StaffStaffgroup 获取属于您想要的组的员工 ID

$staff_ids = $this->Staff->StaffStaffgroup->find(
    'all', 
    array(
        'conditions' => array('StaffStaffgroup.staffgroup_id' => $group_id, ),
        'recursive' => -1,
        'fields' => array('StaffStaffgroup.staff_id'),
    )
);

然后使用之前的结果获取所有员工

$staffs = $this->Staff->find(
    'all', 
    array(
        'conditions' => array(
            'Staff.id' => $staff_ids, 
            'Staff.isActive =' => "1",
            'Staff.last_name LIKE' => "%$name%",
        ),
    )
);
于 2013-02-07T14:06:52.350 回答
1

您应该调查 Containable 行为。

http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

这将允许您查询您的 Staff 模型并包含您的 StaffStaffgroup 模型,从而为您提供以您想要的方式组织的数组。

于 2013-02-05T09:57:56.417 回答
1

我意识到这个问题是很久以前提出的,但我的评论仍然可以帮助其他人找到这篇文章。

我创建了一个在幕后创建与 HABTM 关联的正确连接的行为,使您能够在 HABTM 模型上使用条件。

例子

该模型:

<?php
class Product extends AppModel {

    public $actsAs = array(
        'FilterHabtm.FilterHabtm',
        'Containable' // If you use containable it's very important to load it AFTER FilterHabtm
    );

    public $hasAndBelongsToMany = array(
        'Category' => array(
            'className' => 'Category',
            'foreignKey' => 'product_id',
            'associationForeignKey' => 'category_id',
            'with' => 'CategoryProduct'
        )
    );

}

控制器:

(行为使以下成为可能)

<?php
class ProductsController extends AppController {

    public $name = 'Products';

    public function index($categoryId = null) {
        $products = $this->Product->find('all', array(
            'conditions' => array(
                'Category.id' => $categoryId // Filter by HABTM conditions
            )
        ));
    }

}

请查看此 url 以获取下载和完整的使用说明:https ://github.com/biesbjerg/FilterHabtm

于 2014-05-14T10:24:45.707 回答