Esempio n. 1
0
 /**
  * @param string $class
  * @param array $fields_to_retrieve
  * @param array $options
  */
 public function get_all($class, array $fields_to_retrieve, $options = [])
 {
     $this->fields = $fields_to_retrieve;
     $this->options = $options;
     $this->class = $class;
     /** @var table $obj */
     $obj = new $class();
     $links = [];
     $mlinks = [];
     $obj->set_default_retrieve($fields_to_retrieve, $options);
     table::organise_links($obj, $fields_to_retrieve, $links, $mlinks);
     $dependencies = [get::__class_name($class)];
     foreach ($links as $module => $link_info) {
         $field = $link_info['field'];
         $retrieves = $link_info['retrieve'];
         $dependencies[] = get::__class_name($module);
         $options['join'][$module] = $module . '.' . $field->field_name . '=' . $obj->class_name() . '.' . $field->field_name;
         foreach ($retrieves as $retrieve) {
             $fields_to_retrieve[] = $module . '.' . $retrieve;
         }
     }
     $key = 'get_all_' . $class . '_fetch_' . implode(',', $fields_to_retrieve) . '_options_' . serialize($options);
     $elements = \classes\cache::grab($key, function () use($class, $fields_to_retrieve, $options, $links, $mlinks, $obj) {
         if (!isset($options['order'])) {
             $options['order'] = get::__class_name($class) . '.position';
         }
         $select = _db::get_query($class, $fields_to_retrieve, $options);
         $res = $select->execute();
         if (_db::num($res)) {
             $row = _db::fetch($res, null);
             $mappings = $obj->get_field_mappings(array_keys($row));
             do {
                 /** @var table $class */
                 $object = new $class();
                 $object->set_from_row($row, $links, $mappings);
                 foreach ($mlinks as $module => $blah) {
                     $object->{$module . '_elements'} = new \classes\table_array();
                     $object->{$module} = new _collection();
                 }
                 $this[] = $object;
             } while ($row = _db::fetch($res, null));
         }
         $this->reset_iterator();
         foreach ($mlinks as $module => $link_info) {
             /** @var \form\field_link $field */
             $field = $link_info['field'];
             $retrieves = $link_info['retrieve'];
             $retrieves[] = 'l.' . $obj->get_primary_key_name() . ' AS linked_id';
             $sub_class = $field->get_link_object();
             $classes = $sub_class::get_all($retrieves, ['join' => [get::__class_name($class) . '_link_' . get::__class_name($sub_class) . ' l' => 'l.link_' . $sub_class->get_primary_key_name() . '=' . get::__class_name($sub_class) . '.' . $sub_class->get_primary_key_name()], 'where' => 'l.' . $obj->get_primary_key_name() . ' IN(' . implode(',', $this->get_table_keys()) . ')']);
             /** @var table $sub_object */
             foreach ($classes as $sub_object) {
                 $object = $this->find_table_key($sub_object->linked_id);
                 if ($object) {
                     $object->{$module . '_elements'}->push($sub_object);
                     $object->{$module}->push($sub_object->get_primary_key());
                 }
             }
         }
         return $this->exchangeArray([]);
     }, $dependencies);
     $this->exchangeArray($elements);
 }
Esempio n. 2
0
 /**
  * @param array $fields
  * @param array $options
  *
  * @return bool
  */
 public function do_retrieve(array $fields, array $options)
 {
     self::set_cms_modules();
     $options['limit'] = 1;
     $this->set_default_retrieve($fields, $options);
     $links = $mlinks = [];
     table::organise_links($this, $fields, $links, $mlinks);
     foreach ($links as $module => $link_info) {
         $field = $link_info['field'];
         $retrieves = $link_info['retrieve'];
         $options['join'][$module] = $module . '.' . $field->field_name . '=' . $this->class_name() . '.' . $field->field_name;
         foreach ($retrieves as $retrieve) {
             $fields[] = $module . '.' . $retrieve;
         }
     }
     $query = _db::get_query(get_class($this), $fields, $options);
     $res = $query->execute();
     if (_db::num($res)) {
         $row = _db::fetch($res, null);
         $this->set_from_row($row, $links, $this->get_field_mappings(array_keys($row)));
     }
     /** @var field_link $field */
     foreach ($mlinks as $module => $fields) {
         $this->retrieve_link($fields['field'], $fields['retrieve']);
     }
     return $this->get_primary_key();
 }