7

私は CakePHP 1.2 アプリケーションに取り組んでいます。結合テーブルを介して他のテーブルとのいくつかの HABTM 関係で定義されたモデル「ユーザー」があります。

私は現在、これらの HABTM テーブルの 1 つに格納されているデータに基づいてユーザー情報を見つけることを任されています。残念ながら、クエリを実行すると、テーブルが見つからないというエラーで条件が拒否されます。調べてみると、CakePHP の select ステートメントに HABTM テーブルが含まれていないようです。

私のユーザー HABTM 関係は次のとおりです。

    var $hasAndBelongsToMany = array(
    'Course' => array(
        'className'             => 'Course',
        'joinTable'              => 'course_members',
        'foreignKey'             => 'user_id',
        'associationForeignKey'  => 'course_id',
        'conditions'             => '',
        'order'                  => '',
        'limit'                  => '',
        'uniq'                   => false,
        'finderQuery'            => '',
        'deleteQuery'            => '',
        'insertQuery'            => ''
    ),
    'School' => array(
        'className'             => 'School',
        'joinTable'              => 'school_members',
        'foreignKey'             => 'user_id',
        'associationForeignKey'  => 'school_id',
        'conditions'             => '',
        'order'                  => '',
        'limit'                  => '',
        'uniq'                   => false,
        'finderQuery'            => '',
        'deleteQuery'            => '',
        'insertQuery'            => ''
    ),
    'Team' => array(
        'className'             => 'Team',
        'joinTable'              => 'team_members',
        'foreignKey'             => 'user_id',
        'associationForeignKey'  => 'team_id',
        'conditions'             => '',
        'order'                  => '',
        'limit'                  => '',
        'uniq'                   => false,
        'finderQuery'            => '',
        'deleteQuery'            => '',
        'insertQuery'            => ''
    )
);

エラーは次のとおりです。

SQL エラー: 1054: 'where 句' に不明な列 'School.name' があります

最後に、実行しようとしているクエリ

     SELECT 
 `User`.`id`, `User`.`username`, `User`.`password`, `User`.`firstName`, `User`.`lastName`, `User`.`email

`, `User`.`phone`, `User`.`streetAddress`, `User`.`city`, `User`.`province`, `User`.`country`, `User

`.`postal`, `User`.`userlevel`, `User`.`modified`, `User`.`created`, `User`.`deleted`, `User`.`deleted_date

` FROM `users` AS `User`   WHERE `User`.`id` = 6 AND `School`.`name` LIKE '%Test%'    LIMIT 1
4

4 に答える 4

7

デバッグレベルを2に上げて、SQL出力を確認します。コードが生成しているクエリを見つけると、いくつかあることに気付くでしょう。CakePHPのORMレイヤーは、最初のクエリでHABTM関連のテーブルを結合しません。最初の選択から結果を取得し、次に各アイテムのHABTMデータを個別にフェッチします。結合テーブルは最初のクエリに含まれていないため、結合テーブルでの使用を目的とした条件により、表示されているエラーが発生します。

クックブックには、HABTMの関連付けと、要件に適合するHABTMテーブルの条件に基づいたデータのフェッチに関するセクションがあります。

于 2008-11-30T13:46:44.330 に答える
5

クックブックから: http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

1 つのオプションは、(レシピの代わりに) タグ モデルを検索することです。これにより、関連するすべてのレシピも得られます。

$this->Recipe->Tag->find('all', array(
    'conditions' => array('Tag.name' => 'Dessert')));

結合テーブル モデル (CakePHP が提供する) を使用して、特定の ID を検索することもできます。

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag')));
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'),
    'conditions' => array('RecipesTag.tag_id' => 124) // id of Dessert
));

フィルタリングを可能にするために必要な数の結合を作成する目的で、エキゾチックな関連付けを作成することもできます。次に例を示します。

$this->Recipe->bindModel(array('hasOne' => array('RecipesTag',
    'FilterTag' => array(
        'className' => 'Tag',
        'foreignKey' => false,
        'conditions' => array('FilterTag.id = RecipesTag.tag_id')
))));
$this->Recipe->find('all', array(
    'fields' => array('Recipe.*'),
    'conditions' => array('FilterTag.name' => 'Dessert')
));
于 2010-08-07T18:42:14.463 に答える
2

テーブルは多対多であるため、「school_members」ではなく「schools_users」と呼ぶ必要があります。したがって、両側のテーブル名に複数形を使用することが適切です。

また、HABTM のエイリアスとして Model ClassName "School" を設定します。競合を避けるために、「User is in and has many SchoolS」のように、「Schools」などのより一般的なものに変更する必要があります。

もう 1 つのヒント: User Model ではなく、School Model を使用してユーザーを検索してみてください。

$this->User->Schools->find()

お役に立てれば。

于 2008-12-05T06:11:24.387 に答える
0

FWIW、ここで説明されている規則に従わない限り、結合テーブルは「奇妙な名前」になっているように見えます。

http://book.cakephp.org/view/83/hasAndBelongsToMany-HABTM

いずれにせよ、幸運を祈ります。HABTMがCakePHPの苦痛だったことを覚えています。

于 2008-11-29T10:26:12.443 に答える