浏览代码

Fixing SQL errors when trying to eagerload associations from empty
results, fixes #3167 and #3113

Jose Lorenzo Rodriguez 12 年之前
父节点
当前提交
8b202d918f
共有 2 个文件被更改,包括 20 次插入1 次删除
  1. 6 0
      src/ORM/EagerLoader.php
  2. 14 1
      tests/TestCase/ORM/QueryRegressionTest.php

+ 6 - 0
src/ORM/EagerLoader.php

@@ -367,6 +367,12 @@ class EagerLoader {
 		foreach ($external as $meta) {
 			$contain = $meta['associations'];
 			$alias = $meta['instance']->source()->alias();
+
+			$isSelect = $meta['instance']->strategy() === $meta['instance']::STRATEGY_SELECT;
+			if ($isSelect && empty($collected[$alias])) {
+				continue;
+			}
+
 			$keys = isset($collected[$alias]) ? $collected[$alias] : null;
 			$f = $meta['instance']->eagerLoader(
 				$meta['config'] + ['query' => $query, 'contain' => $contain, 'keys' => $keys]

+ 14 - 1
tests/TestCase/ORM/QueryRegressionTest.php

@@ -30,7 +30,7 @@ class QueryRegressionTest extends TestCase {
  *
  * @var array
  */
-	public $fixtures = ['core.user'];
+	public $fixtures = ['core.user', 'core.article', 'core.tag', 'core.articles_tag'];
 
 /**
  * Tear down
@@ -53,4 +53,17 @@ class QueryRegressionTest extends TestCase {
 		$this->assertEquals(new \DateTime('2007-03-17 01:18:31'), $user->updated);
 	}
 
+/**
+ * Tests that EagerLoader does not try to create queries for associations having no
+ * keys to compare against
+ *
+ * @return void
+ */
+	public function testEagerLoadingFromEmptyResults() {
+		$table = TableRegistry::get('Articles');
+		$table->belongsToMany('ArticlesTags');
+		$results = $table->find()->where(['id >' => 100])->contain('ArticlesTags')->toArray();
+		$this->assertEmpty($results);
+	}
+
 }