Commit cc4514e8 authored by Taylor Otwell's avatar Taylor Otwell

Fix bug in many to many eager loading.

Signed-off-by: 's avatarTaylor Otwell <taylorotwell@gmail.com>
parent 3e00ce2e
<?php namespace Laravel\Database\Eloquent; use Laravel\Database;
<?php namespace Laravel\Database\Eloquent;
use Laravel\Database;
use Laravel\Database\Eloquent\Relationships\Has_Many_And_Belongs_To;
class Query {
......@@ -54,7 +57,7 @@ class Query {
*/
public function first($columns = array('*'))
{
$results = $this->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 @@ class Query {
* 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 @@ class Query {
*
* @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 @@ class Query {
$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 @@ class Query {
$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));
}
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment