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);
}
}
}