В ActiveQuery есть "аналог" PDO'шного fetch - метод each, но есть ли таковой для fetchColumn? Чтобы получить не массив на всю колонку, а в цикле по значению за раз.
ActiveQuery предназначается для работы с ActiveRecord, а если речь идет о переборе одного столбца это не связано с AR. Зачем тогда использовать ActiveQuery если можно использовать просто Query? Почему тогда просто не сделать так: $query->select(['my_column'])
и уже потом работать с результирующей выборкой?
Окей, заменяем ActiveQuery на Query и повторяем вопрос. Мне нужна выборка не в виде массива, а в виде итератора. Колонка, которую нужно прочитать может, например, в память не помещаться. В случае fetch и fetchColumn php будет поштучно читать данные из result set'а mysql, а не копировать всё это в памяти.
Иван Игнатьев: С помощью select Вы можете сформировать запрос с помощью each/batch читать с результирующего набора БД, ничто не мешает сделать так:
$query->select(['my_column']);
foreach ($query->each(10) as $data) {
// обрабатываем $data
}
Максим Федоров: "В ActiveQuery есть "аналог" PDO'шного fetch - метод each, но есть ли таковой для fetchColumn?" Разница в том, что each, как и fetch вернёт массив. Из одного элемента или из десяти не важно, это будет массив. В вашем примере это будет так:
$query->select(['id']);
foreach ($query->each() as $data) {
assert(is_array($data); // ['id'=>123]
assert(is_numeric($data['id']));
doIt($data['id']);
}
Я же хочу выяснить можно ли сделать как-то так:
$query->select(['id']);
foreach ($query->fetchColumn() as $id) {
assert(is_numeric($id)); // 123
doIt($id);
}
Если нельзя, то придётся делать по первому сценарию, но если можно, то зачем мне лишний массив.
Максим Тимофеев: Почти.
> The value returned will be the first column in the first row of the query results.
То есть годится только чтобы получить первое значение первой строки. А хотелось бы получать первое значение каждой строки (в цикле само собой). То есть полный аналог PDO fetchColumn.
Иван Игнатьев: Мне кажется правильнее будет не искать точную копию fetchColumn, а найти оптимальное решение для задачи. Что Вы пытаетесь в итоге получить? Зачем все это? Наверняка есть метод без танца с бубнами.