2011-06-29 45 views
0

我有三个表CakePHP的获取相关联的帖子从标签

  • 帖子
  • 标签
  • posts_tags

我需要编写一个选择和一些控制器逻辑将所有职位,有标签work

这意味着查询tags fin d 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' => '' 
     ) 
    ); 

我的标签表由两个字段:idtag
我PostsTag表由三个字段组成:idtag_idpost_id
我的帖子表是由四个方面组成:idtitlebodycreated

我发现在CakePHP的书一些代码,显示下面的代码:

$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。这就像一个catch 22

干杯,

+0

你可以发布你的标签表中的字段名称是什么? – Headshota

+0

@Headshota - 我已经更新了我的问题以包含它们。 –

+0

丹尼尔您正在使用paginate,您不要在paginate调用中声明'条件'。 Set $ this-> paginate ['conditions'] = $ this-> Article-> getArticleByTagSql('work'); 然后调用$ this-> paginate('Article'); – Leo

回答

1

丹尼尔描述HABTM关系时,这个问题实际上是在Cake documentation回答中间人Receipe /标签

answered this question的人谁也有类似的问题,与文/标签的机型,这个问题的答案使用子查询

+0

我得到一个SQL错误:$ sql \t = \t“SELECT COUNT(*)AS'count'FROM'articles'AS'Article'WHERE'conditions'= Article.id IN(SELECT DISTINCT(ArticlesTag.article_id) FROM articles_tags AS'ArticlesTag'INNER JOIN标记AS'Tag'ON('ArticlesTag'。'tag_id'='Tag'。'id')WHERE'Tag'。'tag'='work'GROUP BY'ArticlesTag'。' article_id的”)“ $错误\t = \t ”1054:未知列 '' 在 'where子句'“ $出\t = \t null' –

+0

条件,参见更新的问题。感谢你的帮助! –

+0

你把我带到了一些有趣的地方。最终,我通过重写pagingCount方法来解决分页问题。现在它工作正常。感谢你的帮助! –

2

如果你使用:

$this->Post->Tag->find('all'... 

你告诉他发现所有标签工作...而且由于其递归,每个标签会包含相关帖子..

尝试这样做,而不是:

$this->Post->find('all'... 

希望蛋糕将是足够聪明(如果你设置了正确的模型关系),只选择具有“工作”标签的帖子..如果这并不工作中,你总是可以设置连接“手动”使用complex find condition

好运

+0

嗯现在,我想起它..这可能无法正常工作:P ..如果它不,请提供生成的查询=) – pleasedontbelong

+0

谢谢队友,我会去。当我今晚下班回家时,我必须这样做,如果你在英国结束了地图,期待8或9左右的回答,但是!)尽管欢迎您的帮助! –

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'"); 
相关问题