ActiveRecord\AbstractRelationship::query_and_attach_related_models_eagerly PHP Method

    protected function query_and_attach_related_models_eagerly(Table $table, $models, $attributes, $includes = array(), $query_keys = array(), $model_values_keys = array())
    {
        $values = array();
        $options = $this->options;
        $inflector = Inflector::instance();
        $query_key = $query_keys[0];
        $model_values_key = $model_values_keys[0];
        foreach ($attributes as $column => $value) {
            $values[] = $value[$inflector->variablize($model_values_key)];
        }
        $values = array($values);
        $conditions = SQLBuilder::create_conditions_from_underscored_string($table->conn, $query_key, $values);
        if (isset($options['conditions']) && strlen($options['conditions'][0]) > 1) {
            Utils::add_condition($options['conditions'], $conditions);
        } else {
            $options['conditions'] = $conditions;
        }
        if (!empty($includes)) {
            $options['include'] = $includes;
        }
        if (!empty($options['through'])) {
            // save old keys as we will be reseting them below for inner join convenience
            $pk = $this->primary_key;
            $fk = $this->foreign_key;
            $this->set_keys($this->get_table()->class->getName(), true);
            if (!isset($options['class_name'])) {
                $class = classify($options['through'], true);
                if (isset($this->options['namespace']) && !class_exists($class)) {
                    $class = $this->options['namespace'] . '\\' . $class;
                }
                $through_table = $class::table();
            } else {
                $class = $options['class_name'];
                $relation = $class::table()->get_relationship($options['through']);
                $through_table = $relation->get_table();
            }
            $options['joins'] = $this->construct_inner_join_sql($through_table, true);
            $query_key = $this->primary_key[0];
            // reset keys
            $this->primary_key = $pk;
            $this->foreign_key = $fk;
        }
        $options = $this->unset_non_finder_options($options);
        $class = $this->class_name;
        $related_models = $class::find('all', $options);
        $used_models_map = array();
        $related_models_map = array();
        $model_values_key = $inflector->variablize($model_values_key);
        $query_key = $inflector->variablize($query_key);
        foreach ($related_models as $related) {
            $related_models_map[$related->{$query_key}][] = $related;
        }
        foreach ($models as $model) {
            $key_to_match = $model->{$model_values_key};
            if (isset($related_models_map[$key_to_match])) {
                foreach ($related_models_map[$key_to_match] as $related) {
                    $hash = spl_object_hash($related);
                    if (isset($used_models_map[$hash])) {
                        $model->set_relationship_from_eager_load(clone $related, $this->attribute_name);
                    } else {
                        $model->set_relationship_from_eager_load($related, $this->attribute_name);
                    }
                    $used_models_map[$hash] = true;
                }
            } else {
                $model->set_relationship_from_eager_load(null, $this->attribute_name);
            }
        }
    }