0

更新 #2 -- 解決策が見つかりました: このルックアップの使用が判明しました:

$this->User->Group->find(....)

私が必要としていたものではありませんでした。使用する必要のあるユーザーのグループを引き出すには:

$this->User->find('all',array('conditions' => array('User.id' => $user_id)));

< /UPDATE #2><問題>

Usersテーブルとテーブルの間に HABTM 関係を作ろうとしていGroupsます。問題は、私がこの呼び出しを発行したときです:

$this->User->Group->find('list');

発行されるクエリは次のとおりです。

SELECT [Group].[id] AS [Group__id], [Group].[name] AS [Group__name] FROM [groups] AS [Group] WHERE 1 = 1

groups_usersこの時点では、規則に従ってデータベースで定義されたテーブルを使用する動作が予想されるため、関係を間違って定義したとしか思えません。私の関係:

class User extends AppModel {
        var $name = 'User';
        //...snip...
    var $hasAndBelongsToMany = array(
        'Group' => array(
            'className'             => 'Group',
            'foreignKey'            => 'user_id',
            'associationForeignKey' => 'group_id',
            'joinTable'             => 'groups_users',
            'unique'                => true,
        )
    );
        //...snip...
}

class Group extends AppModel {
    var $name = 'Group';
    var $hasAndBelongsToMany = array ( 'User' => array(
        'className'             => 'User',
        'foreignKey'            => 'group_id',
        'associationForeignKey' => 'user_id',
        'joinTable'             => 'groups_users',
        'unique'                => true,
    ));
}

私の HABTM の理解は間違っていますか? groups_users現在認証されているユーザーが関連付けられているグループのリストが返されるように、CakePHP を使用してテーブルをクエリできるこの多対多の関係を実装するにはどうすればよいでしょうか?

アップデート

ndmによって提案された変更を適用した後も、すべてのグループを返し'User'、ユーザーがそのグループのメンバーシップを持っている場合は要素を返す大きな配列の戻り値 (Too big to post) を受け取ります。CakePHP が使用するクエリをもう一度見ました。

SELECT 
    [User].[id] AS [User__id], 
    [User].[username] AS [User__username], 
    [User].[password] AS [User__password], 
    [User].[email] AS [User__email], CONVERT(VARCHAR(20), 
    [User].[created], 20) AS [User__created], CONVERT(VARCHAR(20), 
    [User].[modified], 20) AS [User__modified], 
    [User].[full_name] AS [User__full_name], 
    [User].[site] AS [User__site], 
    [GroupsUser].[user_id] AS [GroupsUser__user_id], 
    [GroupsUser].[group_id] AS  [GroupsUser__group_id], 
    [GroupsUser].[id] AS [GroupsUser__id] 
FROM 
    [users] AS [User] JOIN 
        [groups_users] AS [GroupsUser] ON (
        [GroupsUser].[group_id] IN (1, 2, 3, 4, 5) AND 
        [GroupsUser].[user_id] = [User].[id]
    ) 

メンバーシップを持っているエントリのグループ ID と名前のみを受け取るように簡単に調整する方法はありますか? 私は使用することを考えていました:

array('conditions'=>array('GroupsUser.user_id'=>$user_id))

...しかし、グループ テーブルで sql エラーが発生します。

SELECT TOP 1 [Group].[name] AS [Group__name], CONVERT(VARCHAR(20), [Group].[created], 20) AS [Group__created], CONVERT(VARCHAR(20), [Group].[modified], 20) AS [Group__modified], [Group].[id] AS [Group__id] FROM [groups] AS [Group] WHERE [GroupsUser].[user_id] = 36 ORDER BY (SELECT NULL) 
4

1 に答える 1

1

list検索タイプが何をすべきかを誤解していると思います。

クエリはまったく問題ありません。検索タイプは、モデルの主キーがインデックスとして使用され、表示フィールドlistが値として使用される単一モデルのみのレコードのリストを取得するために使用されます。

http://book.cakephp.org/2.0/en/models/retriving-your-data.html#find-list

于 2012-11-05T22:56:58.830 に答える