• Как добавить содержимое аттрибута "type" в registerJsFile()?

    @shtepsil
    IT специалист в вэбразработке
    В файле:
    app/assets/AppAsset.php

    public $js = [
            ['js/scripts.js', 'type' => 'text/jsx', 'position' => \yii\web\View::POS_HEAD],
        ];
    Ответ написан
    Комментировать
  • Yii2 построитель SQL запросов. Один и тот же запрос, но разные результаты выборки?

    @shtepsil Автор вопроса
    IT специалист в вэбразработке
    Ответ сам пришел мне в голову.
    В общем то решение все 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)
    Ответ написан
    Комментировать