Exemplo n.º 1
0
 /**
  * Функция принимает в качестве аргументов массив с ID словарей и массив с условиями для выборки из таблицы значений словарей.
  * Условия представляют собой одномерный массив, у которого:
  * - ключи: соответствуют столбцу key таблицы dictionary_fields_values
  * - значения: соответствуют столбцу value таблицы dictionary_fields_values
  * Функция делает выборку из БД, подсчитывая кол-во подходящих записей "значений словарей" под заданные условия для каждого словаря.
  *
  * @param array $dic_ids
  * @param array $array
  * @return $this|DicFieldVal
  *
  * @author Alexander Zelensky
  */
 public static function counts_by_fields($dic_ids = array(), $array = array())
 {
     $tbl_dicval = new DicVal();
     $tbl_dicval = $tbl_dicval->getTable();
     $result = new DicFieldVal();
     $tbl_dicfieldval = $result->getTable();
     #Helper::d($array);
     foreach ($array as $key => $value) {
         #Helper::dd($value);
         if (is_array($value)) {
             $result = $result->where($tbl_dicfieldval . '.key', $key)->whereIn($tbl_dicfieldval . '.value', $value);
         } else {
             $result = $result->where($tbl_dicfieldval . '.key', $key)->where($tbl_dicfieldval . '.value', $value);
         }
     }
     $result = $result->join($tbl_dicval, $tbl_dicval . '.id', '=', $tbl_dicfieldval . '.dicval_id')->whereIn($tbl_dicval . '.dic_id', $dic_ids)->where($tbl_dicval . '.version_of', NULL);
     ## Делаем выборку всех подходящих записей...
     $result = $result->select($tbl_dicfieldval . '.*', $tbl_dicval . '.dic_id')->get();
     ## DEBUG
     $queries = DB::getQueryLog();
     #Helper::smartQuery(end($queries), 1); die;
     #Helper::ta($result);
     #Helper::smartQueries(1);
     ## Собираем числа в массив и группируем по dicval_id -> dic_id
     $counts = array();
     foreach ($result as $r => $record) {
         if (!@is_array($counts[$record->value])) {
             $counts[$record->value] = array();
         }
         if (!@is_array($counts[$record->value][$record->dic_id])) {
             $counts[$record->value][$record->dic_id] = array();
         }
         #@++$counts[$record->dicval_id][$record->dic_id];
         $counts[$record->value][$record->dic_id][$record->dicval_id] = 1;
     }
     foreach ($counts as $dicval_id => $data) {
         foreach ($data as $dic_id => $elements) {
             $counts[$dicval_id][$dic_id] = count($elements);
         }
     }
     #Helper::dd($counts);
     return $counts;
 }