CakePHP:双向自指有许多关联
我正试图通过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
- 图片通过“匹配”(连接模型)与其他图片关联
- 每场比赛有两张图片,并存储当前评分和总投票数
- 查看图片时,任何方向的所有相关图像都应可用(通过其匹配项)
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”?