在Kohana中使用COUNT表达式编写SQL

时间:2012-12-13 08:37:16

标签: php kohana kohana-3

我有两张桌子:

事件(id,incident_description) 评论(id,incident_id,comment_description)

我想编写这样的SQL表达式:

SELECT incident.*, COUNT(comment.id) AS com 
FROM incident 
LEFT JOIN comment ON comment.incident_id=incident.id 
GROUP BY incident.id 
ORDER BY com DESC

它在phpmyadmin中运行良好。

我在ORM中写道:

ORM::factory('incident')
->select('incident.*',array('COUNT("comment.id")', 'com'))
->join('comment', 'LEFT')
->on('comment.incident_id', '=', 'incident.id')
->group_by('incident.id')
->order_by('com', 'DESC')
->find_all();

但是我收到了一个错误: system / libraries / Database.php [296]: * trim()期望参数1为字符串,给定数组 *

来自Database.php的

代码:

 foreach ($sql as $val)
                {
                        if (($val = trim($val)) === '') continue;

                        if (strpos($val, '(') === FALSE AND $val !== '*')
                        {
                                if (preg_match('/^DISTINCT\s++(.+)$/i', $val, $matches))
                                {
                                        $val            = $this->config['table_prefix'].$matches[1];
                                        $this->distinct = TRUE;
                                }
                                else
                                {
                                        $val = (strpos($val, '.') !== FALSE) ? $this->config['table_prefix'].$val : $val;
                                }

                                $val = $this->driver->escape_column($val);
                        }

                        $this->select[] = $val;
                }

2 个答案:

答案 0 :(得分:4)

array(DB::expr('COUNT("comment.id")'), 'com')

您不希望查询生成器尝试转义复杂表达式或其他数据库函数。在这些情况下,您需要使用使用DB::expr创建的数据库表达式。

答案 1 :(得分:-1)

对于Kohana 2你想要这样的东西

ORM::factory('incident')
->select('incident.*','COUNT("comment.id") AS comments')
->join('comment', 'comment.incident_id', 'incident.id', 'LEFT')
->groupby('incident.id')
->orderby('comments', 'DESC')
->find_all();

或使用数据库查询

DB::instance()->query('SELECT incident.*, COUNT(comment.id) AS comments 
FROM incident 
LEFT JOIN comment ON comment.incident_id = incident.id 
GROUP BY incident.id 
ORDER BY comments DESC');