Добавить подзапрос к 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(), все будет в порядке.