CakePHP:双向自引用hasMany通过关联

时间:2012-05-14 21:59:21

标签: cakephp associations has-many-through

我正试图通过CakePHP中的关系来解决双向自我指导问题(多么令人满意!)。

我正在开发一个图片匹配网站。

  • 图片通过“匹配”(连接模型)与其他图片相关联。
  • 每场比赛都有两张图片,并存储当前的评分和总票数。
  • 查看图片时,任何方向的所有相关图片都应该可用(通过匹配)。

我首先定义了与连接模型的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中最好的方法吗?我很困惑。
是否可以动态创建反向关系?

3 个答案:

答案 0 :(得分:0)

你可以在飞行中创建真实的模型:: bindModel(),非常有用的东西,这将使你能够绑定反向关系,或者你想要的任何方向。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

同样使用可包含的行为,您可以创建无限的链条来重新查找相关的日期。

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

基本上你可以循环遍历所有的模型,只要每个链以某种方式与下一个链相关来解释它更简单的例子(请忽略其中的逻辑)

圆属于广场 Square areTo Triangle

所以Triangle与Circle(直接)无关,但是Square之间有点介于

之间
Circle->find('all', array('...', contain => array('Square.Triangle')); 

或者为了获得更多乐趣,我们可以通过循环圈来圈出

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

等等,当然这些例子都是无用的,没有任何编程逻辑,但我希望你理解你可以循环来回无限数量的关系。

答案 1 :(得分:0)

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

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的所有相关数据。

答案 2 :(得分:0)

我认为这是被放弃的,但它很容易解决 - 它与阶段有关

  

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

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

这可以通过几种方式完成,但最简单的方法是在保存呼叫之前查找,并将主键包含在匹配记录数据中。基本上不要将其保存为HABTM,只有在您已经尝试查找现有匹配记录主键(id)并更新数据以保存它时,才将其另存为hasMany