|
@@ -1,4 +1,7 @@
|
|
|
-<?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));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|