CakePHP:双向自指有许多关联

CakePHP:双向自指有许多关联,cakephp,associations,has-many-through,Cakephp,Associations,Has Many Through,我正试图通过CakePHP中的许多关系来了解双向自指(双向自指)的含义(真是太多了!) 我正在制作一个图片匹配网站 图片通过“匹配”(连接模型)与其他图片关联 每场比赛有两张图片,并存储当前评分和总投票数 查看图片时,任何方向的所有相关图像都应可用(通过其匹配项) 我首先定义了hasMany-through与连接模型的关系 pictures\u matches联接表具有以下结构: id | picture_id | partner_id | rating | total_votes 我的m

我正试图通过CakePHP中的许多关系来了解双向自指(双向自指)的含义(真是太多了!)

我正在制作一个图片匹配网站

  • 图片通过“匹配”(连接模型)与其他图片关联
  • 每场比赛有两张图片,并存储当前评分和总投票数
  • 查看图片时,任何方向的所有相关图像都应可用(通过其匹配项)
我首先定义了hasMany-through与连接模型的关系

pictures\u matches联接表具有以下结构:

id | picture_id | partner_id | rating | total_votes
我的match join模型关联如下所示:

class PictureMatch extends AppModel {

...

    public $belongsTo = array(
        'Picture' => array(
            'className' => 'Picture',
            'foreignKey' => 'picture_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Partner' => array(
            'className' => 'Picture',
            'foreignKey' => 'partner_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
}
每个图片都需要能够从任意方向访问其相关图片,但这正是我抓不住的地方。 看起来我需要保存关系的两侧,但这会破坏连接模型中存储的额外数据-对于两个db条目,投票可能会根据方向而有所不同

有没有人能用CakePHP来阐明实现这一点的最佳方法?我很困惑。

是否可以动态创建反向关系?

您可以动态创建不动产vie Model::bindModel(),非常有用的东西这将允许您动态绑定反向关系或任何您想要的方向

还可以使用可包含的行为创建无限的检索关联日期的链

包含('Picture.PictureMatch.Partner.PictureMatch.Picture…'))

基本上,只要每个链与下一个链有某种关联,您就可以遍历所有模型,以更好地解释它。简单示例(请忽略其中的逻辑)

圆归方 正方形属于三角形

所以三角形和圆并没有直接的关系,但正方形介于两者之间

Circle->find('all', array('...', contain => array('Square.Triangle')); 
或者,为了获得更多的乐趣,让我们一圈一圈地玩

Circle->find('all', array('...', contain => array('Square.Trinagle.Square.Circle'));

以此类推,当然这些示例是无用的,没有任何编程逻辑,但我希望您理解一点,即您可以通过无数个来回的关系进行循环。

我不确定这是否是最佳解决方案,但如果您这样做:

public $belongsTo = array(
    'Picture1' => array(
        'className' => 'Picture',
        'foreignKey' => 'picture_id',
    ),
    'Picture2' => array(
        'className' => 'Picture',
        'foreignKey' => 'picture_id',
    ),
    'Partner' => array(
        'className' => 'Partner',
        'foreignKey' => 'partner_id',
    ),
);

然后,当你进行搜索时,你只需搜索
($this->data['Picture1']==$var | |$this->data['Picture2']==$var)
,只要你将
recursive
设置为1或2,你就应该会得到该
图片的所有相关数据,但它很容易解决——它与相位有关

销毁联接模型中存储的额外数据

这意味着您的保存正在运行
deleteAll
并在匹配时插入记录。。。相反,您需要查找并更新该记录


有几种方法可以做到这一点,但最简单的方法是在保存调用之前,查找它,并将主键包含在匹配记录数据中。基本上,不要将其保存为HABTM,只有在您已经尝试查找现有匹配记录主键(
id
)并更新数据以与其一起保存时,才将其保存为hasMany。

您有没有想过这个问题?Partner部分下的className是否应该是“Partner”?