1

私は2つのテーブルを持っています:

インシデント (id、インシデントの説明) コメント (id、インシデントの ID、コメントの説明)

そのような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;
                }
4

2 に答える 2

4

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

クエリ ビルダが複雑な式やその他のデータベース関数をエスケープしようとするのは望ましくありません。このような場合、DB::exprで作成されたデータベース式を使用する必要があります。

于 2012-12-13T09:44:00.867 に答える
-1

コハナ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クエリを使用する

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');
于 2012-12-14T01:01:51.930 に答える