Ответ сам пришел мне в голову.
В общем то решение все 2,5 недели было у меня перед глазами.
В общем когда построитель запросов Yii2 формировал объект выборки с данными из связной таблицы,
из связной таблицы выбиралось по несколько строк, которые присоединялись к каждой строке основной таблицы.
т.е. например к первой из строк основной таблицы присоединялось 3 строки из связной таблицы, ко второй строке основной таблицы присоединялось к примеру 7 строк из связной таблицы и тд.
Простой запрос выдал выборку с повторяющимися ID основной таблицы, вот так:
0 => Array (id=>7, name=>user7, price=>43087),
1 => Array (id=>3, name=>user3, price=>43000),
2 => Array (id=>4, name=>user4, price=>42099),
3 => Array (id=>4, name=>user4, price=>32999),
4 => Array (id=>3, name=>user3, price=>31000),
5 => Array (d=>11, name=>user11, price=>25783)
А построитель запросов Yii2 давал вот это:
0 => Array (id=>3, name=>user3, price=>43000),
1 => Array (id=>4, name=>user4, price=>42099),
2 => Array (id=>11, name=>user11, price=>25783),
3 => Array (id=>7, name=>user7, price=>25783)
Задвоенные ID 3 и 4 были перезаписаны.
Вообще моя цель была такая - по условиям фильтра выбрать данные из основной таблицы и к каждой выбранной строке присоединить по одной строке из связной таблицы.
И вывести на страницу 6 элементов, отсортированных по полю(price) из связной таблицы.
А так как к каждой строке основной таблицы - присоединялось по несколько строк из связной таблицы, то в объекте выборки - ID основной таблицы не были уникальны, они повторялись.
Получалось вот это:
// Строка основной таблицы
0 => Array (id=>7, name=>user7),
// Строки связной таблицы
Array( price=>43087 ),
// Строка основной таблицы
1 => Array (id=>3, name=>user3),
// Строки связной таблицы
Array(
price=>43000
price=>31000
),
// Строка основной таблицы
2 => Array (id=>4, name=>user4, price=>42099),
// Строки связной таблицы
Array(
price=>42099
price=>32999
),
// Строка основной таблицы
3 => Array (d=>11, name=>user11),
// Строки связной таблицы
Array( price=>25783 ),
Итоговый объект выборки смотрелся так:
0 => Array (id=>7, name=>user7, price=>43087),
1 => Array (id=>3, name=>user3, price=>43000),
2 => Array (id=>4, name=>user4, price=>42099),
3 => Array (id=>4, name=>user4, price=>32999),
4 => Array (id=>3, name=>user3, price=>31000),
5 => Array (d=>11, name=>user11, price=>25783)
т.е. сначала у меня формировался объект выборки по LIMIT 6, далее из этих шести элементов - Yii2 переписывал повторяющиеся ID основной таблицы и в итоговой выборке на страницу попадало меньше чем 6 элементов.
Т.е. Yii2 формировал объект выборки так, чтобы в итоговой выборке - ID основной таблицы не повторялись, тем самым уменьшая количество строк меньше чем LIMIT 6.
Сделать это ДО LIMIT возможности нет!
Решение:
В основной запрос я добавил
->distinct()
и ->join() заменил на ->joinWith()
$obj = Customers::find()
->select(['customers.*', 'products.price'])
->distinct()
->joinWith('product')
->orderBy(['products.price' => SORT_DESC])
->offset(1)->limit(6)
->asArray();
$obj->all();
Тем самым Yii2 сформировал нужный мне конечный объект!
В объект выборки попало 6 элементов из основной таблицы, далее через связь hasOne() к каждой строке основной таблицы привязалось по ОДНОМУ элементу!
И я получил нужные мне 6 элементов без повторяющихся ID основной таблицы:
0 => Array (id=>7, name=>user7, price=>43120),
1 => Array (id=>3, name=>user3, price=>43100),
2 => Array (id=>9, name=>user9, price=>42099),
3 => Array (id=>4, name=>user4, price=>32999),
4 => Array (id=>15, name=>user15, price=>31000),
5 => Array (d=>11, name=>user11, price=>25783)