参照hasMany通过协会
我试图通过CakePHP中的关系(多么有趣!)来解决双向自引用hasMany问题。
我正在图片匹配网站上工作。
我已经开始通过与连接模型定义hasMany through关系。
pictures_matches连接表具有以下结构:
id | picture_id | partner_id | rating | total_votes
我的匹配连接模型关联如下所示:
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' => ''
)
);
}
每张照片都需要能够从任一方向访问其相关图片,但这正是我的把握正在滑落的地方。 看起来我需要保存关系的双方,但是这破坏了存储在连接模型中的额外数据 - 带有两个数据库条目,投票可能因方向而异。
任何人都可以在CakePHP中做到这一点的最佳方式吗? 我很困惑。
是否有可能在飞行中创建反向关系?
你可以通过Model :: bindModel()方式创建实时提示,非常有用的东西,这将允许你绑定反向关系或者任何你想要的方向。
http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html
同样使用Containable行为,您可以创建无限连锁的回顾您的关联日期例如。
包含( 'Picture.PictureMatch.Partner.PictureMatch.Picture ......')
基本上,只要每个链都与下一个链有关联,就可以遍历所有模型,从而更好地解释它(请忽略逻辑)
圆属于方形广场属于三角形
所以三角形与Circle不直接相关,但Square之间有点相似
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你应该找回该Picture
所有相关数据。
我认为这被放弃了,但它很容易解决 - 它与这个阶段有关
销毁存储在联接模型中的额外数据
这意味着您的保存正在运行deleteAll
并在匹配中插入记录...而您需要查找并更新该记录...
这可以通过几种方式完成,但最简单的方法是在保存呼叫之前,查看它并将主键包含在匹配记录数据中。 基本上不要将它保存为HABTM,并且如果您已经尝试查找现有的匹配记录主键( id
)并更新数据以保存它,只能将它另存为hasMany。