参照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。

    链接地址: http://www.djcxy.com/p/64881.html

    上一篇: referential hasMany Through associations

    下一篇: CakePHP hasAndBelongsToMany vs hasMany through