2013-03-28 56 views
1

我正在使用PHPActiveRecord和CodeIgniter。我正在尝试创建一个博客CMS,并且博客有许多类别,并且引用了另一个名为blogrefs的表。所以基本上LEFT JOIN Association返回未知列

博客=> blogrefs => blogcats

blogrefs通过blogrefs.blog_id

blogrefs有博客指通过blogrefs.blogcat_id

function get_blogs($params = array()){ 

    $CI =& get_instance(); 

    $joins = 'LEFT JOIN blogrefs ON blogs.id = blogrefs.blog_id'; 
    $joins .= 'LEFT JOIN blogcats ON blogrefs.blogcat_id = blogcats.id'; 
    $category = (isset($params['category']))?$params['category']:''; 
    $keyword = (isset($params['keyword']))?$params['keyword']:''; 
    $status = (!isset($params['status']) || $params['status'] == '')?'':$params['status']; 
    $order_by = (isset($params['order_by']))?$params['order_by']:'created_on'; 
    $direction = (isset($params['direction']))?$params['direction']:'DESC'; 
    $limit = (isset($params['limit']))?$params['limit']:''; 
    $offset = (isset($params['offset']))?$params['offset']:''; 
    $st = ''; 
    if($status == ''){ 
     $st = '!'; 
    } 

     if(!empty($category)) 
     { 
      $conditions = array(
       "((blogcats.id = ?) OR (blogcats.parent_id = ?)) 
       AND blogs.status $st= ? 
       AND (blogs.title LIKE '%$keyword%' OR blogs.content LIKE '%$keyword%')",$category,$category,$status 
      ); 

     }else{ 
      $conditions = array(
       "blogs.status $st= ? 
       AND (blogs.title LIKE '%$keyword%' OR blogs.content LIKE '%$keyword%')",$status 
      ); 
     } 

    $result = Blog::find('all',array(
     'include'  => array('blogcat','blogref','user'), 
     'joins'   => $joins, 
     'conditions' => $conditions, 
     'limit'   => $limit, 
     'offset'  => $offset, 
     'order'   => "$order_by $direction", 
     'group'   => 'blogs.id' 
    )); 

    $count = Blog::find('all',array(
     'conditions' => $conditions 
    )); 

    $object = new stdClass; 
    $object->posts = $result; 
    $object->total = count($count); 
    return $object; 

} 

一切与blogcats指作品不仅如果我使用

((blogcats.id =?)或(blogcats.parent_id =?))

从特定类别获取博客。任何答案将非常感激。

+0

如果您使用phpactiverrecord,没有更快的方法来获取所有这些相关的对象吗?喜欢使用关联? – Nanne

回答

0

您的错误是在您定义连接的第一部分的末尾缺失的空间。

$joins = 'LEFT JOIN blogrefs ON blogs.id = blogrefs.blog_id'; 
$joins .= 'LEFT JOIN blogcats ON blogrefs.blogcat_id = blogcats.id'; 

计算结果为:

LEFT JOIN blogrefs ON blogs.id = blogrefs.blog_idLEFT JOIN blogcats ON blogrefs.blogcat_id = blogcats.id 

你会发现,第一个连接是通过寻找一个名为“blog_idLEFT”列和第二搞砸了现在加入将是一个内部联接,不外部左连接。

我建议或者使用davedriesmans的建议,或者找出一些方法输出最终生成的mySQL查询。 (或两者)