Запрос в Yii2

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

Запрос в Yii2

Сообщение anton12rus »

Здравствуйте уважаемые знатоки. Хотел бы попросить у вас помощи, так как найти точного решения не получилось.

Мне требуется создать отбор записей через left join по связной таблице, а именно.
Есть таблица с записями блогов, у блогов присутствуют в отдельной таблице доп поля, в них записаны параметры. Доп поля динамичны и нет возможности их как-то сделать статичными, поэтому выглядит это примерно так
Таблица блогов
Изображение

Таблица параметров
Изображение

Мне нужно сделать поиск по параметрам, вот примерно то, что я делаю, но результат конечно не такой, какой я ожидал.

SELECT COUNT(*) FROM `blog` LEFT JOIN `blog_field` ON blog_field.message = blog.id WHERE (blog_field.field = 481 and blog_field.value >= 0);

Результат есть.


Когда пытаюсь сделать выборку по двум полям, результата нет.

SELECT COUNT(*) FROM `blog` LEFT JOIN `blog_field` ON blog_field.message = blog.id WHERE (blog_field.field = 481 and blog_field.value >= 0) AND (blog_field.field = 509 and blog_field.value >= 0);


Вот как через фрэймворк пытаюст сделать

$sql = Blog::find()->with('blogField')->with('imageBlog')->with('regions')->with('categorys');
$sql->LeftJoin('blog_field','blog_field.message = blog.id')->groupBy('blog.id');
$sql->andWhere('blog_field.field = 481 and blog_field.value >= 10');
$sql->andWhere('blog_field.field = 509 and blog_field.value >= 10');


Подскажите пожалуйста правильное решение для такой фильтрации данных. Заранее спасибо.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Запрос в Yii2

Сообщение Alexum »

между двумя условиями нужно использовать OR а не AND, соответственно использовать по ситуации конструкции с ->orWhere() или ->andWhere(['OR', [условие 1], [условие2]]).
anton12rus
Сообщения: 13
Зарегистрирован: 2019.08.09, 15:34

Re: Запрос в Yii2

Сообщение anton12rus »

Alexum писал(а): 2019.08.09, 17:06 между двумя условиями нужно использовать OR а не AND, соответственно использовать по ситуации конструкции с ->orWhere() или ->andWhere(['OR', [условие 1], [условие2]]).
OR это своего рода ИЛИ. В таком случае я получу такого рода запрос
$sql = Blog::find()->with('blogField')->with('imageBlog')->with('regions')->with('categorys');
$sql->LeftJoin('blog_field','blog_field.message = blog.id')->groupBy('blog.id');
$sql->andWhere('blog_field.field = 481 and blog_field.value >= 10');
ИЛИ
$sql->orWhere('blog_field.field = 509 and blog_field.value >= 10');

А мне надо фильтровать последовательно с параметром "И"
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Запрос в Yii2

Сообщение Alexum »

Что значит фильтровать последовательно? Вы написали запрос:

SELECT COUNT(*) FROM `blog` LEFT JOIN `blog_field` ON blog_field.message = blog.id WHERE (blog_field.field = 481 and blog_field.value >= 0) AND (blog_field.field = 509 and blog_field.value >= 0);

, который в принципе не может ничего вернуть, т.к. одна записать не может удовлетворять одновременно нескольким таким условиям. Что-то вернётся только если между ними поставить OR.

PS. Если поиск осуществляется по одному значению можно поле группировать через IN:

$sql->andWhere('blog_field.value >= 10');
$sql->andWhere(['IN', 'blog_field.field',[481,509]]);
anton12rus
Сообщения: 13
Зарегистрирован: 2019.08.09, 15:34

Re: Запрос в Yii2

Сообщение anton12rus »

Спасибо, но вариант не подходит к сожалению, мне нужно задать поиск строки, если она отвечает всем параметрам в поиске.
Я раcчитывал как-то по быстрому через LEFT Join найти решение, но судя по всему это не возможно. Есть вариант поступить похожим образом через подзапросы. Спасибо, что откликнулись. Если будут еще идеи, напишите пожалуйста. Буду признателен.

Сделать мне нужно как-то так.
Выбрать строку из таблицы blog, если присуствуют строки в связной таблице (field = 481 у которой значение value больше или равно 10) и (field = 508 у которой значение value больше или равно 100)
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Запрос в Yii2

Сообщение yiiliveext »

anton12rus писал(а): 2019.08.09, 17:40
Сделать мне нужно как-то так.
Выбрать строку из таблицы blog, если присуствуют строки в связной таблице (field = 481 у которой значение value больше или равно 10) и (field = 508 у которой значение value больше или равно 100)

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

SELECT `blog`.id, `blog`.title  FROM `blog` 
INNER JOIN `blog_field` t1 ON t1.`message` = `blog`.`id` 
INNER JOIN `blog_field` t2 ON t2.`message` = `blog`.`id` 
WHERE (t1.`field` = 481 and t1.`value` >= 10) AND (t2.`field` = 508 and t2.`value` >= 100)
Ответить