db = &$db; } public function schema($table) { $query = "SHOW COLUMNS FROM $table"; $result = $this->db->query($query)->getResult(); return $result; } public function insertItem($table, $data) { $this->db->table($table)->insert($data); return $this->db->insertID(); } public function getAnyItems($table, $where = false) { $builder = $this->db->table($table); if ($where) $builder->where($where); return $builder->get()->getResult(); } public function updateItem($table, $where, $data) { $this->db->table($table)->where($where)->update($data); return $this->db->affectedRows(); } function get_primary_key_field_name($table) { $query = "SHOW KEYS FROM $table WHERE Key_name = 'PRIMARY'"; return $this->db->query($query)->getRow()->Column_name; } //Get one item public function getItem($table, $where) { return $this->db->table($table) ->where($where) ->get() ->getRow(); } //Get total rows per request public function countTotalRows($table, $where = null, $request, $schema, $fields) { $count_query = "SELECT COUNT(*) as total FROM " . $table; //get primary_key field name $pk = $this->get_primary_key_field_name($table); if ($where) { $count_query .= " WHERE ("; $i = 0; foreach ($where as $key => $value) { if ($i > 0) $count_query .= " AND "; //Check if operator is different from = (equal sign) $operator_arr = explode(" ", $key); if (isset($operator_arr[1])) $operator = $operator_arr[1]; else $operator = "="; $count_query .= " `$operator_arr[0]`$operator" . $this->db->escape($value) . " "; $i++; } $count_query .= ")"; } if ($table_search = $request->getPost('table_search')) { $allEmpty = true; $tempQuery = ''; if ($where) $tempQuery .= " AND "; else $tempQuery .= " WHERE "; $tempQuery .= " ( "; $i = 0; // echo '
';
            //  print_r($schema);
            // echo '
';
            foreach ($schema as $column) {
                if (trim($request->getPost($column->Field)) == '')
                    continue;
                if ($column->Extra == 'other_table')
                    continue;

                $allEmpty = false;
                if ($i > 0)
                    $tempQuery .= " OR ";


                $tempQuery .= " " . $table_search
                    . "." . $column->Field
                    . " LIKE '%"
                    . trim($this->db->escapeLikeString($request->getPost($column->Field)))
                    . "%' ESCAPE '!'";

                $i++;
            }
            $tempQuery .= ")";
            if (!$allEmpty)
                $count_query .= $tempQuery;
        }

        return $this->db->query($count_query)->getRow()->total;
    }


    public function getItems($table, $where = null, $request, $schema, $fields, $order, $offset, $per_page)
    {
        $result_query = "SELECT * FROM " . $table;
        //get primary_key field name
        $pk = $this->get_primary_key_field_name($table);


        //Check for relation fields
        foreach ($fields as $key => $rel_field) {
            if (isset($rel_field['relation']) && !isset($rel_field['relation']['save_table'])) {
                $rfield = $rel_field['relation'];
                $result_query .= " LEFT JOIN  " . $rfield['table'] . " ON " . $table . '.' . $key . "=" . $rfield['table'] . "." . $rfield['primary_key'] . "  ";
                //$this->db->join($rfield['table'], $table.'.'.$key.'='.$rfield['table'].'.'.$rfield['primary_key'], 'left');
            }
        }

        if ($where) {
            $result_query .= " WHERE (";
            $i = 0;
            foreach ($where as $key => $value) {
                if ($i > 0)
                    $result_query .= " AND ";

                //Check if operator is different from = (equal sign)
                $operator_arr = explode(" ", $key);
                if (isset($operator_arr[1]))
                    $operator = $operator_arr[1];
                else
                    $operator = "=";

                $result_query .= "  `$operator_arr[0]`$operator'$value' ";

                //$this->db->where($key, $value);
                $i++;
            }
            $result_query .= ")";
        }

        if ($request->getPost('table_search')) {

            $allEmpty = true;
            $tempQuery = '';
            $i = 0;
            if ($where)
                $tempQuery .= " AND ";
            else
                $tempQuery .= " WHERE ";

            //$tempQuery .= " ( ";

            foreach ($schema as $column) {

                if ($request->getPost($column->Field) == '')
                    continue;

                $allEmpty = false;
                $col_search = [];
                $col_search[] = $column->Field;
                if (isset($fields[$column->Field]['relation']) && isset($fields[$column->Field]['relation']['save_table'])) {
                    //Search relational table to get the ids of related ids
                    $relField = $fields[$column->Field]['relation'];

                    $parent_table = $relField['table'];
                    $relation_table = $relField['save_table'];
                    $joinString = $relation_table . '.' . $relField['child_field'] . '=' . $parent_table . '.' . $relField['primary_key'];
                    $likeColumns = $relField['display'];
                    $likeTerm = $request->getPost($column->Field);
                    //$relselect is optional. when used it will add DISTINCT to prevent dublicates
                    $relSelect = $relation_table . '.' . $relField['parent_field'];
                    $relatedItems = $this->searchRelatedItems($parent_table, $relation_table, $joinString, $likeColumns, $likeTerm, $relSelect);
                    $relatedItemsIdArr = [];
                    if (!$relatedItems)
                        $relatedItemsIdArr = '-1';
                    else {
                        //Create an array of ids for whereIn statement
                        foreach ($relatedItems as $relatedItem) {
                            $relatedItemsIdArr[] = $relatedItem->{$relField['parent_field']};
                        }
                    }

                    if ($i > 0)
                        $tempQuery .= " AND ";

                    if (is_array($relatedItemsIdArr))
                        $relTempQuery = '' . $table . '.' . $pk . ' IN (' . implode(',', $relatedItemsIdArr) . ')';
                    else
                        $relTempQuery = $table . '.' . $pk . ' = ' . $relatedItemsIdArr;

                    //  echo $tempQuery.'
'; $tempQuery .= $relTempQuery; // echo $tempQuery; $i++; //$allEmpty = false; continue; } else if (isset($fields[$column->Field]['relation'])) { $col_search = $fields[$column->Field]['relation']['display']; //check if display is an array of columns if (!is_array($col_search)) $col_search[] = $col_search; $table_search = $fields[$column->Field]['relation']['table']; } else { $table_search = $table; //$col_search[] = $column->Field; } if ($i > 0) $tempQuery .= " AND "; //For loop is required when search must be performed in multiple relational columns from another table $searchLikeTempQuery = ''; $searchLikeTempQueryArr = []; foreach ($col_search as $colToSearch) { $searchLikeTempQueryArr[] = $this->generateLikeClause($table_search, $colToSearch, $request->getPost($column->Field)); } if (count($col_search) > 1) { $searchLikeTempQuery = implode(' OR ', $searchLikeTempQueryArr); $searchLikeTempQuery = "($searchLikeTempQuery)"; } else $searchLikeTempQuery = $searchLikeTempQueryArr[0]; $tempQuery .= $searchLikeTempQuery; //$this->db->like($table_search.'.'.$col_search, $request->getPost($column->Field), 'both'); $i++; } $tempQuery .= isset($searchLikeTempQuery) ? " " : ""; if (!$allEmpty) $result_query .= $tempQuery; } if ($order) { $result_query .= " ORDER BY "; $i = 0; foreach ($order as $ord) { if ($i > 0) $result_query .= ", "; $result_query .= $ord[0] . " " . $ord[1]; //$this->db->order_by($ord[0], $ord[1]); $i++; } } else { $result_query .= " ORDER BY " . $pk . " DESC"; //$this->db->order_by($pk, 'DESC'); } $result_query = rtrim($result_query, ','); $result_query .= " LIMIT $offset, $per_page "; //$this->db->limit($per_page, $offset); $page_items = $this->db->query($result_query)->getResult(); return $page_items; } public function getRelationItems($table, $where = null, $orderField = null, $orderDirection = null) { $builder = $this->db->table($table); if ($where) $builder->where($where); if ($orderField) $builder->orderBy($orderField, $orderDirection); $items = $builder->get() ->getResult(); return $items; } public function deleteItems($table, $where = null, $whereInField = null, $whereInValue = null) { $builder = $this->db->table($table); if ($where) $builder->where($where); if ($whereInField && $whereInValue) $builder->whereIn($whereInField, $whereInValue); return $builder->delete(); } public function batchInsert($table, $data) { $builder = $this->db->table($table); return $builder->insertBatch($data); } public function getRelationItemsJoin($table, $where, $joinTable, $joinString) { $builder = $this->db->table($table); $builder->where($where); $builder->join($joinTable, $joinString); return $builder->get()->getResult(); } public function searchRelatedItems($parent_table, $relation_table, $joinString, $likeColumns, $likeTerm, $select = '*') { $builder = $this->db->table($relation_table); $builder->select($select); $builder->join($parent_table, $joinString); for ($i = 0; $i < count($likeColumns); $i++) { if ($i < 1) { $builder->like($parent_table . '.' . $likeColumns[$i], $likeTerm); } else { $builder->orLike($parent_table . '.' . $likeColumns[$i], $likeTerm); } } return $builder->distinct()->get()->getResult(); } public function generateLikeClause($table_search, $colToSearch, $searchTerm) { return $table_search . "." . $colToSearch . " LIKE '%" . trim($this->db->escapeLikeString($searchTerm)) . "%' ESCAPE '!'"; } //Get total rows per request public function GetOreByCommessa($IDcommessa) { $cont_query = "SELECT SUM(orOre) as OreLavorate FROM Orari WHERE orIDcommessa='" . $IDcommessa . "'"; //return $query; return $this->db->query($cont_query)->getRow()->OreLavorate; } public function GetStimaByCommessa($IDcommessa) { $cont_query = "SELECT SUM(stStima) AS Stima FROM `Stime` WHERE stIDcommessa='" . $IDcommessa . "'"; //return $query; return $this->db->query($cont_query)->getRow()->Stima; } }