diff --git a/laravel/database/eloquent/query.php b/laravel/database/eloquent/query.php index e30fe0e2..e55e6a40 100644 --- a/laravel/database/eloquent/query.php +++ b/laravel/database/eloquent/query.php @@ -1,4 +1,7 @@ -hydrate($this->model, $this->table->take(1)->get($columns, false)); + $results = $this->hydrate($this->model, $this->table->take(1)->get($columns)); return (count($results) > 0) ? head($results) : null; } @@ -63,12 +66,12 @@ public function first($columns = array('*')) * Get all of the model results for the query. * * @param array $columns - * @param bool $include + * @param bool $keyed * @return array */ - public function get($columns = array('*'), $include = true) + public function get($columns = array('*'), $keyed = true) { - return $this->hydrate($this->model, $this->table->get($columns), $include); + return $this->hydrate($this->model, $this->table->get($columns), $keyed); } /** @@ -97,9 +100,10 @@ public function paginate($per_page = null, $columns = array('*')) * * @param Model $model * @param array $results + * @param bool $keyed * @return array */ - public function hydrate($model, $results, $include = true) + public function hydrate($model, $results, $keyed = true) { $class = get_class($model); @@ -124,10 +128,20 @@ public function hydrate($model, $results, $include = true) $new->original = $new->attributes; - $models[$result[$this->model->key()]] = $new; + // Typically, the resulting models are keyed by their primary key, but it + // may be useful to not do this in some circumstances such as when we + // are eager loading a *-to-* relationships which has duplicates. + if ($keyed) + { + $models[$result[$this->model->key()]] = $new; + } + else + { + $models[] = $new; + } } - if ($include and count($results) > 0) + if (count($results) > 0) { foreach ($this->model_includes() as $relationship => $constraints) { @@ -183,12 +197,19 @@ protected function load(&$results, $relationship, $constraints) $query->table->where_nested($constraints); } - // Before matching the models, we will initialize the relationship - // to either null for single-value relationships or an array for - // the multi-value relationships as their baseline value. $query->initialize($results, $relationship); - $query->match($relationship, $results, $query->get()); + // If we're eager loading a many-to-many relationship we will disable + // the primary key indexing on the hydration since there could be + // roles shared across users and we don't want to overwrite. + if ( ! $query instanceof Has_Many_And_Belongs_To) + { + $query->match($relationship, $results, $query->get()); + } + else + { + $query->match($relationship, $results, $query->get(array('*'), false)); + } } /**