Как составить запрос ActiveQuery?

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

Как составить запрос ActiveQuery?

Сообщение kradwhite »

Есть таблица c такой структурой.

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

        $this->createTable('some_table', [
            'id' => $this->bigPrimaryKey()->unique(),
            'external_id' => $this->bigInteger()->notNull(),
            'name' => $this->string()->notNull(),
            'value' => $this->string()->notNull()
        ]);
        $this->createIndex(
            'idx-some_table-external_id',
            'some_table',
            'item_id'
        );
        $this->addForeignKey(
            'fk-some_table-external_id',
            'some_table',
            'external_id',
            'external_table',
            'id',
            'CASCADE'
        );
Мне нужно составить запрос на ActiveQuery для получения external_id. В результате должны быть только те external_id, для которых существуют и совпадают по значению поля 'name' и 'value' из нескольких записей.
Например есть 4 записи:

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

    insert into some_table(external_id, name, value) values(1, color, red);
    insert into some_table(external_id, name, value) values(1, weight, 100);
    insert into some_table(external_id, name, value) values(2, color, blue);
    insert into some_table(external_id, name, value) values(2, weight, 23);
Запрос с условием name='color', value='red' and name='weight' and value='100' должен вернуть external_id=1;
Если честно я даже не представляю как такое условие задать на чистом sql. Подозреваю что нужно использовать count(*) и фильтровать записи сравнивая количество найденных с количеством связок name и value. Но в sql я не силен. Заранее благодарен за помощь.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как составить запрос ActiveQuery?

Сообщение ElisDN »

Если без JOIN-ов, то в цикле делаете запросы:

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

SELECT external_id FROM ... WHERE name='color' AND value='red'
SELECT external_id FROM ... WHERE name='weight' AND value='100'
Потом по их результатам собираете массив $ids по array_intersect_key() и из основной таблицы забираете с ->andWhere('id' => $ids).
Последний раз редактировалось ElisDN 2017.10.21, 23:24, всего редактировалось 1 раз.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как составить запрос ActiveQuery?

Сообщение Nex-Otaku »

Одним запросом

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

select t1.id from table1 as t1, table1 as t2
where 
(t1.id=t2.id)
and (t1.name='color') and (t1.value='red')
and (t2.name='weight') and (t2.value='100')
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Как составить запрос ActiveQuery?

Сообщение caHek2x »

а может

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

SELECT external_id 
FROM some_table
WHERE (name='color' AND value='red') OR (name='weight' AND value='100')
GROUP BY external_id 
HAVING count(*)>1
Ответить