Browse Source

Merge pull request #946 from franzliedke/patch-23

Fix eager loading constraints
Taylor Otwell 12 years ago
parent
commit
5c3ede74d9
2 changed files with 19 additions and 23 deletions
  1. 8 13
      laravel/database/eloquent/model.php
  2. 11 10
      laravel/database/eloquent/query.php

+ 8 - 13
laravel/database/eloquent/model.php

@@ -257,26 +257,21 @@ abstract class Model {
 	{
 		$includes = (array) $includes;
 
-		$all_includes = array();
+		$this->includes = array();
 
-		foreach($includes as $include)
+		foreach ($includes as $relationship => $constraints)
 		{
-			$nested = explode('.', $include);
-
-			$inc = array();
-
-			foreach($nested as $relation)
+			// When eager loading relationships, constraints may be set on the eager
+			// load definition; however, is none are set, we need to swap the key
+			// and the value of the array since there are no constraints.
+			if (is_numeric($relationship))
 			{
-				$inc[] = $relation;
-
-				$all_includes[] = implode('.', $inc);
+				list($relationship, $constraints) = array($constraints, null);
 			}
 
+			$this->includes[$relationship] = $constraints;
 		}
 
-		//remove duplicates and reset the array keys.
-		$this->includes = array_values(array_unique($all_includes));
-
 		return $this;
 	}
 

+ 11 - 10
laravel/database/eloquent/query.php

@@ -217,22 +217,23 @@ class Query {
 	 */
 	protected function model_includes()
 	{
-		$includes = array();
+		$relationships = array_keys($this->model->includes);
+		$implicits = array();
 
-		foreach ($this->model->includes as $relationship => $constraints)
+		foreach ($relationships as $relationship)
 		{
-			// When eager loading relationships, constraints may be set on the eager
-			// load definition; however, is none are set, we need to swap the key
-			// and the value of the array since there are no constraints.
-			if (is_numeric($relationship))
+			$parts = explode('.', $relationship);
+
+			$prefix = '';
+			foreach ($parts as $part)
 			{
-				list($relationship, $constraints) = array($constraints, null);
+				$implicits[$prefix.$part] = NULL;
+				$prefix .= $part.'.';
 			}
-
-			$includes[$relationship] = $constraints;
 		}
 
-		return $includes;
+		// Add all implicit includes to the explicit ones
+		return $this->model->includes + $implicits;
 	}
 
 	/**