MySQL:使用该单个表的多个属性将多个表连接到一个表

时间:2014-05-19 07:47:34

标签: mysql cakephp

我有3张桌子:

  • 活动
  • 帖子
  • 评论

活动有两个属性:item_iditem_type。属性item_type指定它是帖子还是评论,item_id包含相应类型的ID。评论也与帖子有关。我需要根据发布时间对我的活动进行排序。 既然活动可以链接到帖子或评论,我怎样才能定义这种关联并在cake php中写一个查询?

编辑:
与该问题相关的属性如下 活动:item_id,item_type
帖子:id,创建
评论:id,post_id

2 个答案:

答案 0 :(得分:0)

在你的情况下帖子有评论没有发表评论不能在那里 我不是一个蛋糕php的人,但我可以从一个示例查询中解释。

SELECT * FROM Activities a   
       INNER JOIN Posts p ON a.item_id = p.item_id   
       INNER JOIN Comments c ON c.post_id = p.id 
ORDER BY created

我认为这会对你有帮助。

答案 1 :(得分:0)

Activity模型中

public $belongsTo = array
(
    'Post' => array
    (
        'foreignKey' => 'item_id',
        'conditions' => array('Activity.item_type' => 'Post')
    ),
    'Comment' => array
    (
        'foreignKey' => 'item_id',
        'conditions' => array('Activity.item_type' => 'Comment')
    )
);

所以在ActivitiesController你可以做到

$this->Activity->virtualFields['post_created'] => "IF(Activity.item_type = 'Post'), Post.created, CommentPost.created)"; 

$this->Activity->find
(
    'all',
    array
    (
        'joins' => array
        (
            array
            (
                'table' => 'posts',
                'alias' => 'CommentPost',
                'conditions' => array(
                    'Comment.post_id = Post.id'
            )
        ),
        'order' => array('Activity.post_created'), 
    )
);