我正在使用CakePHP 2.1
让我们说明我有以下模型和关系:
Posts
属于Edition
Posts
HABTM Editors
Posts
HABTM Tags
我是PostsController
的推理,我希望找到属于某个Posts
的所有Edition
,Editor.id=55
与Tag.id=33
相关,Posts
} 相关的。
我找到了许多例子,其中基于HABTM关系的条件找到Editor
是通过从$this->Editor->find('all',
array(
'conditions'=>array('Editor.id'=>55),
'contain'=>array('Post')
)
);
“反转”查找方向和推理来完成的。
contain
不幸的是,这在这里不起作用,因为我想提出多个HABTM关系。
同样使用editors
不起作用,因为它只会切断一个分支(posts
),但不会帮助过滤它的父($this->Post->find('all',
array('conditions'=>array(
'Edition.id'=>4,
// start pseudo code
'Post.Editor' => 'has at least one related editor with id=55',
'Post.Tag' => 'has at least one related tag with id=33',
)
)
);
)。
我该如何解决这个问题? 我是否可能需要采用临时连接?如果是这样,有人可以大致解释一下采取什么方法吗?
修改 一些伪代码,以说明我想要实现的目标:
// Paginate over Cards that belong to current Subscription (belongsTo) AND the User is related to as an Editor (HABTM)
$this->paginate = array(
'fields' => array('id','title','workingtitle','attachment_count','subscription_id'),
'joins' => array(
// create Editor-join
array(
'table' => 'cards_users',
'alias' => 'Editor',
'type' => 'left',
'conditions' => array(
'Editor.card_id = Card.id'
)
),
array(
'table' => 'users',
'alias' => 'User',
'type' => 'left',
'conditions'=> array(
'User.id = Editor.user_id'
)
)
),
'conditions' => array(
'OR' => array(
// is Card in current subscription? (straightforward condition)
array('Card.subscription_id',$subscription_id),
// is current User assigned as Editor? (condition works with join above)
array('User.id' => $user['id'])
)
),
'limit' => 10
);
亲切的问候,
巴特
编辑解决方案: 关注@RichardAtHome我在下面创建了解决方案。 (尚未)采用多个连接条件,但似乎没有必要:
{{1}}
答案 0 :(得分:6)
对于这种类型的查询,我通常发现自己构建连接最简单,因为cake不会加入,它会执行多个查询(从表a中选择匹配的行,然后从表b中获取匹配的行)。 / p>
您的查询需要看起来像这样:
$this->Post->find('all',
array(
'conditions'=>array('Post.edition_id'=>4),
'joins'=>array(
array(
'type'=>'inner',
'table'=>'posts_editors',
'alias'=>'PostsEditor',
'conditions'=>array(
'PostsEditor.post_id = Post.id',
'PostsEditor.editor_id'=>55 // your criteia for editor id=55
)
),
array(
'type'=>'inner',
'table'='posts_tags',
'alias'=>'PostsTag',
'conditions'=>array(
'PostsTag.post_id = Post.id',
'PostsTag.tag_id'=>33 // your criteria for tag id = 33
)
)
)
)
);
检查输出的SQL以查看此查询在幕后实际执行的操作。
答案 1 :(得分:0)
尝试:
$this->Post->find('all',
array('conditions'=>array(
'Edition.id'=>4,
'Editor.id' => '55',
'Tag.id' => '33',
)
)
);