5

前文: 数日前、私は HABTM フィルターを解決するために質問をしました。

私が達成したいこと: StaffStaffgroup で使用される GroupID によるスタッフのフィルタリング

私は次のテーブルレイアウトを持っています

  • スタッフ(人は多くのグループに所属できます)
  • staff_staffgroups (HABTM リンクテーブル)
  • staffgroups (グループ名を持っています)

変数 $tmp は作業配列を取得しますが、問題は Staff が StaffStaffgroups の子オブジェクトであることです。配列を解析して再構築することはできましたが、これは良い解決策ではありません。したがって、Staff で条件を使用したいのですが(コメント行を参照)、エラー 1054 "column not found: 1054 Unknown column" が表示されます。バインドとバインド解除を試みましたが、結果はありません。

$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 ダンプをチェックアウトすると、クエリが完了したことがわかります。

私はそれを2つのステップで行います

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 に答える