dao, where формирование запросов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
yaa
Сообщения: 15
Зарегистрирован: 2014.04.03, 15:25

dao, where формирование запросов

Сообщение yaa »

Натолкните, пожалуйста, на мысли

У меня много относительно сложных запросов к БД и есть необходимость производить фильтрацию данных по разным параметрам,
пытаюсь все это дело как-то автоматизировать. Приведу пример простой, но в котором понятно что нужно.
Есть, например, такой запрос

Код: Выделить всё

$posts = Yii::$app->db->createCommand('SELECT * FROM post WHERE user_id=:user_id AND status=:status')
    ->bindValue(':user_id', $_GET['user_id'])
    ->bindValue(':status', 1) 
Здесь мы ищем по пользователю и статусу, но допустим мы захотим в другом месте искать по дате создания

Код: Выделить всё

$posts = Yii::$app->db->createCommand('SELECT * FROM post WHERE created_at>:created_at')
    ->bindValue(':created_at', '2016-01-01') 
Видно, что "основная" часть запроса одинаковая

Код: Выделить всё

SELECT * FROM post
Отличаются только условия в where.

Так вот, хочется иметь метод получения данных с возможностью динамической фильтрации, что-то типа

Код: Выделить всё

public function getPostsByFilter(array $filter)
{
    $sql_where = someMethods($filter); // например, генерирует sql код, типа where user_id=1 AND status=1
    $posts = Yii::$app->db->createCommand('SELECT * FROM post ' . $where)
} 
Для этого можно попробовать использовать QueryBuilder, например, так

Код: Выделить всё

$query = new \yii\db\Query();
foreach ($filter as $k => $value) {
    $query->andFilterWhere($value);
}
$sql_where = $db->createCommand(
    $this->getQueryBuilder($db)->buildWhere($query->where, $query->params),
    $query->params
)->getRawSql() 
но я не уверен, насколько это будет удобно и правильно.

Или лучше написать что-то свое для обработки фильтров?

Кто как видит решения подобных задач или может уже решали подобные?
Ответить