0

私は CakePHP の本を読みましたが、うまくいきませんでした。
という名前のテーブルがありますfrendslists。すべてのユーザー ( owner_user_id) には友達が多すぎるので、友達をfriend_id列に追加します。(モデル名はフレンドリスト)

CREATE TABLE IF NOT EXISTS `friendslists` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `owner_user_id` int(20) unsigned NOT NULL,
  `friend_id` int(20) NOT NULL COMMENT 'id of the friend',
  PRIMARY KEY (`id`),
  KEY `friend_id` (`friend_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--id-------owner_user_id-----friend_id
--------------------------------------
--1--------1234--------------9200-----
--2--------1234--------------3210-----
--3--------1234--------------7600-----

私もprofilesテーブルを持っています。すべてのユニークな人物には、そこにプロファイルがあります。1 人が持つことができるプロファイルは 1 つだけです。(モデル名はProfile)

CREATE TABLE IF NOT EXISTS `profiles` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `profile_user_id` int(20) NOT NULL,
  `name` varchar(50) NOT NULL,
  `location` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `profile_user_id` (`profile_user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--id------profile_user_id---name------location-
-----------------------------------------------
--1-------9200--------------michael----usa-----
--2-------3210--------------john-------uk------
--3-------7600--------------danny------denmark-

フレンドリスト テーブルをプロファイル テーブルにリンクしたいと考えています。これは 1 対 1 (hasOne) または多対 1 (belongsTo) タイプの関係ですか?

friendslists テーブルにクエリを実行すると、友達のプロファイル データを取得したいと考えています。CakePHP のモデルとテーブル内で何をすべきですか?

次のような外部キーを作成しました。

ALTER TABLE `friendslists`
  ADD CONSTRAINT `friendslists_ibfk_1` 
  FOREIGN KEY (`friend_id`) 
  REFERENCES `profiles` (`profile_user_id`) 
  ON DELETE CASCADE ON UPDATE CASCADE;

モデルファイルを次のように変更しました。

class Friendslist extends AppModel {
    var $name = 'Friendslist';
    var $useTable = 'friendslists';

    public $belongsTo = array(
        'Profile' => array(
            'className'    => 'Profile',
            'foreignKey'   => 'friend_id'
        )
    )

    function getAll(){
        return $this->find('all');
    }
}

最後に私がこれを行うとき:

$records=$this->Friendslist->find('all', array('conditions' => array(
    'Friendslist.owner_user_id' => 1234)
));

私はこれらの結果を得る:

     [Friendslist] => Array
            (
                [id] => 1
                [owner_user_id] => 1234
                [friend_id] => 9200
            )

        [Profile] => Array
            (
                [id] => 
                [profile_user_id] => 
                [name] => 
                [location] => 
             )

    )

プロファイル テーブルには profile_user_id=9200 のレコードがあるはずです。しかし、プロファイル レコードは空になります。

4

1 に答える 1

0

なぜあなたがフレンドリストをプロフィールにリンクしているのか、少し混乱しています。人と人をリンクさせて、そこからプロファイルを取得する方が理にかなっていると思いませんか?

いずれにせよ、あなたが説明しているのは HasAndBelongsToMany(HABTM) です

したがって、Person モデルでは、関連付けられている他の多くの人 (またはあなたの場合はプロファイル) が存在することを指定し、ルックアップ テーブルを指定する必要があります。

何かのようなもの...

public $hasAndBelongsToMany = array(
        'Person' => array(
            'className' => 'Profile',
            'joinTable' => 'friendslists',
            'foreignKey' => 'owner_id',
            'associationForeignKey' => 'friend_id'
        )
    );

そして、friendlists モデル内で、所有者とプロファイルの両方をリストする属しているとして説明します。

何かのようなもの:

public $belongsTo = array(
    'Person' => array(
            'className' => 'Person'
           ,'foreignKey' => 'owner_user_id'
        ),
    'Profile' => array(
            'className' => 'Profile'
           ,'foreignKey' => 'friend_id'
        )
);

どのエンティティが動いているかを正確に理解するのに苦労したので、名前を微調整する必要があるかもしれませんが、少なくともアイデアは得られるはずです.

于 2013-10-08T16:45:04.970 に答える