私は Cakephp のタグ付けシステムに取り組んでいます。タグは、ルートである他のタグの子になることができます。(子供の子供はいません)。
モデルはユーザーとタグです。それらの関係は次のようになります。
//User.php:
public $hasAndBelongsToMany = array(
'Tag' => array(
'className' => 'Tag',
'joinTable' => 'users_tags',
'foreignKey' => 'user_id',
'associationForeignKey' => 'tag_id',
'unique' => true,
),
);
//Tag.php:
var $belongsTo = array(
'Parent' => array(
'className' => 'Tag',
'foreignKey' => 'parent_id',
'dependent' => true,
),
);
単純なページネーションをしようとすると、
$this->User->recursive = 2;
$this->set('users', $this->paginate());
次のような奇妙な結果が得られます。
array(
(int) 0 => array(
'User' => array(
...
),
'Tag' => array(
(int) 0 => array(
'id' => '1',
'parent_id' => null,
...
'Parent' => array()
),
(int) 1 => array(
'id' => '2',
'parent_id' => '1',
...
'Parent' => array(
'id' => '1',
'parent_id' => null,
...
)
)
)
),
(int) 1 => array(
'User' => array(
...
),
'Tag' => array(
(int) 0 => array(
'id' => '1',
'parent_id' => null,
...
'Parent' => array(
'Parent' => array() //What's up with this parent inside the parent?
)
),
(int) 1 => array(
'id' => '2',
'parent_id' => '1',
...
'Parent' => array(
'id' => '1',
'parent_id' => null,
...
)
)
)
)
)
奇妙な結果を返したタグは、実際には配列の最初のタグと同じタグ (id #1) であることがわかります。なぜそれが直前で、2回目は間違っているのか、私は混乱しています..?