我有三张桌子
我需要编写一些控制器逻辑来选择和设置所有标记为work
这意味着查询tags
以查找查询标记的id
,检查关联的posts_tags
表以查找匹配项,使用post_id
返回正确的帖子表中的帖子。
我不确定如何开始这个查询,我是CakePHP的新手,可以用一只手......请?
如果有帮助,这是我的帖子模型关系:
var $hasAndBelongsToMany = array(
'Tag' => array(
'className' => 'Tag',
'joinTable' => 'posts_tags',
'foreignKey' => 'posts_id',
'associationForeignKey' => 'tag_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
我的代码表由两个字段组成:id
和tag
我的帖子标签表由三个字段组成:id
,tag_id
和post_id
“我的帖子”表格由四个字段组成:id
,title
,body
和created
我在CakePHP Book上找到了一些显示以下代码的代码:
$this->Recipe->Tag->find('all', array('conditions'=>array('Tag.name'=>'Dessert')));
他们认为这是一个类似的想法,所以我试图适应:
$this->Post->Tag->find('all', array('conditions'=>array('Tag.tag'=>'work')));
然而,这没有奏效。这将返回所有帖子而不进行过滤。
我接受了@Leo的建议,并试图让他的代码适应我的:
function getArticleByTagSql($tag) {
$dbo = $this->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('DISTINCT(ArticlesTag.article_id)'),
'table' => "articles_tags",
'joins' => array(
array('table' => 'tags',
'alias' => 'Tag',
'type' => 'INNER',
'conditions' => array('ArticlesTag.tag_id = Tag.id')
)
),
'alias' => "ArticlesTag",
'conditions' => array("Tag.tag" => $tag),
'order' => null,
'group' => "ArticlesTag.article_id",
'limit' => null
),
$this
);
$subQuery = ' Article.id IN (' . $subQuery . ')';
return $dbo->expression($subQuery);
}
控制器:
$this->set('articles', $this->paginate(array(
'conditions' => $this->Article->getArticleByTagSql('work')
)));
然而,无论我在paginate()方法中键入什么键 - 在这种情况下,“条件”出现在查询中,我无法弄清楚为什么 - 我一直得到未知列'条件'错误。错误是使用paginate函数,数据在没有它的情况下正确返回,但是没有它我就不能使用paginator。这就像一个捕获22
干杯,
丹
答案 0 :(得分:2)
如果您使用:
$this->Post->Tag->find('all'...
你告诉他找到所有标签的工作......并且由于它的递归,每个标签都会包含相关的帖子..
尝试这样做:
$this->Post->find('all'...
希望蛋糕足够聪明(如果你已正确设置你的模型关系)只选择具有“work”标签的帖子..如果这不起作用,你总是可以“手动”设置连接complex find condition
祝你好运
答案 1 :(得分:1)
Daniel在描述Receipe / Tag之间的HABTM关系时,Cake documentation实际回答了这个问题
我answered this question对于与文章/标签模型存在类似问题的人,该答案使用了子查询
答案 2 :(得分:0)
我有同样的问题,但我尝试了这个查询,它对我有用......可能它也会对你有效:)
$claims = $this->Claim->query("SELECT DISTINCT Claim.id,Claim.title, Claim.description FROM
claims as Claim
LEFT JOIN claim_tags as ClaimTag ON Claim.id = ClaimTag.claim_id
LEFT JOIN tags as Tag ON Tag.id =ClaimTag.tag_id
WHERE Tag.id = '$id'");