Добавить подзапрос к Kohana 3 ORM

Я пытаюсь заставить ORM Коханы построить запрос, который возвращает запись, но также подсчитывает связанные строки в другой таблице. Если бы я делал это в ручном запросе, результат был бы таким:

SELECT
*,
(SELECT COUNT(answer_id) FROM user_question_answers WHERE answer_question_id = question_id) as answer_count
FROM users_questions
WHERE question_user_id = 13

Можно ли добавить необработанный SQL к любым частям модели ORM Коханы?

Спасибо

2 ответа

Решение

Хорошо, я понял это. Я расширил драйвер ORM, создав classes/orm.php, который содержит следующее:

<?php defined('SYSPATH') or die('No direct access allowed.');

class ORM extends Kohana_ORM {
    public function add_subquery($query) {
        $this->_db_pending[] = array(
            'name' => 'select',
            'args' => array(DB::expr($query)),
        );

        return $this;
    }
}

Затем в моем звонке ORM я сделал следующее:

$questions = ORM::factory('question')
    ->add_subquery('(SELECT COUNT(answer_id) FROM user_question_answers WHERE answer_question_id = question_id) as answer_count')
    ->where('question_user_id', '=', $this->current_user->id)
    ->find_all();

Я все еще выясняю все тонкости Коханы, и я обеспокоен тем, что с помощью DB::expr() может представлять угрозу безопасности, если это будет использоваться с данными, предоставленными пользователем. Но я не буду использовать его ни с кем из пользователей, так что пока все нормально.

Если у кого-то есть лучшее решение, мне было бы интересно посмотреть, как вы решите проблему.

Если вы сначала выполняете подзапрос с помощью построителя запросов и вставляете его в свою функцию ->add_subquery(), все будет в порядке.

Другие вопросы по тегам