1

検索機能があり、スタッフにはありがたいので、名前で検索できます。今、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());

条件は正しく設定されていると思いますが、うまく機能しません。

乾杯遠藤

4

4 に答える 4

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%",
        )
    )
);
于 2013-01-29T07:50:23.893 に答える
1
$tmpConditions['OR'][] = array('staffgroups.groupname LIKE' => "%$group%");

CakePHP の規約に従っていません。そのはず:

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

モデルとデータベースの規則:

モデル:

モデルのクラス名は単数形でキャメルケースです。Person、BigPerson、ReallyBigPerson はすべて、従来のモデル名の例です。

データベース テーブル:

CakePHP モデルに対応するテーブル名は複数形でアンダースコアが付いています。上記のモデルの基礎となるテーブルは、それぞれ people、big_people、really_big_people です。

データベース フィールド:

2 つ以上の単語を含むフィールド名には、first_name のように下線が引かれます。

staff_groupsこれらの規則に従って、 というフィールドを含む というテーブルが必要ですgroup_name。関連するモデルの名前は になりますStaffGroup

于 2013-01-28T13:24:34.823 に答える
0

に変更staffgroupsするだけStaffgroupです。モデルとテーブルの命名規則は、dbテーブルmy_tablesにmodelという名前が付けられることを意味しますMyTablehttp://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html#model-and-database-conventionsを参照してください。

于 2013-01-28T15:48:27.943 に答える
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
);

私はこれが仕事をするべきだと信じています...

于 2013-01-28T14:41:45.137 に答える