mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	Fixes #13467: yii\data\ActiveDataProvider no longer queries models if models count is zero
				
					
				
			This commit is contained in:
		
				
					committed by
					
						
						Alexander Makarov
					
				
			
			
				
	
			
			
			
						parent
						
							ecd2dc0d1b
						
					
				
				
					commit
					7d82bbcd37
				
			@ -18,6 +18,7 @@ Yii Framework 2 Change Log
 | 
				
			|||||||
- Bug #13592: Fixes Oracle’s `yii\db\oci\Schema::setTransactionIsolationLevel()` (sergeymakinen)
 | 
					- Bug #13592: Fixes Oracle’s `yii\db\oci\Schema::setTransactionIsolationLevel()` (sergeymakinen)
 | 
				
			||||||
- Bug #13594: Fixes insufficient quoting in `yii\db\QueryBuilder::prepareInsertSelectSubQuery()` (sergeymakinen)
 | 
					- Bug #13594: Fixes insufficient quoting in `yii\db\QueryBuilder::prepareInsertSelectSubQuery()` (sergeymakinen)
 | 
				
			||||||
- Enh #13576: Added support of `srcset` to `yii\helpers\Html::img()` (Kolyunya)
 | 
					- Enh #13576: Added support of `srcset` to `yii\helpers\Html::img()` (Kolyunya)
 | 
				
			||||||
 | 
					- Enh #13467: `yii\data\ActiveDataProvider` no longer queries models if models count is zero (kLkA, Kolyunya)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2.0.11.2 February 08, 2017
 | 
					2.0.11.2 February 08, 2017
 | 
				
			||||||
 | 
				
			|||||||
@ -104,6 +104,9 @@ class ActiveDataProvider extends BaseDataProvider
 | 
				
			|||||||
        $query = clone $this->query;
 | 
					        $query = clone $this->query;
 | 
				
			||||||
        if (($pagination = $this->getPagination()) !== false) {
 | 
					        if (($pagination = $this->getPagination()) !== false) {
 | 
				
			||||||
            $pagination->totalCount = $this->getTotalCount();
 | 
					            $pagination->totalCount = $this->getTotalCount();
 | 
				
			||||||
 | 
					            if ($pagination->totalCount === 0) {
 | 
				
			||||||
 | 
					                return [];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            $query->limit($pagination->getLimit())->offset($pagination->getOffset());
 | 
					            $query->limit($pagination->getLimit())->offset($pagination->getOffset());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (($sort = $this->getSort()) !== false) {
 | 
					        if (($sort = $this->getSort()) !== false) {
 | 
				
			||||||
 | 
				
			|||||||
@ -7,12 +7,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace yiiunit\framework\data;
 | 
					namespace yiiunit\framework\data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use yii\base\InvalidCallException;
 | 
				
			||||||
use yii\data\ActiveDataProvider;
 | 
					use yii\data\ActiveDataProvider;
 | 
				
			||||||
use yii\db\Query;
 | 
					use yii\db\Query;
 | 
				
			||||||
use yiiunit\data\ar\ActiveRecord;
 | 
					use yiiunit\data\ar\ActiveRecord;
 | 
				
			||||||
use yiiunit\data\ar\Customer;
 | 
					use yiiunit\data\ar\Customer;
 | 
				
			||||||
use yiiunit\data\ar\Item;
 | 
					use yiiunit\data\ar\Item;
 | 
				
			||||||
use yiiunit\framework\db\DatabaseTestCase;
 | 
					use yiiunit\framework\db\DatabaseTestCase;
 | 
				
			||||||
 | 
					use yiiunit\framework\db\UnqueryableQueryMock;
 | 
				
			||||||
use yiiunit\data\ar\Order;
 | 
					use yiiunit\data\ar\Order;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -177,4 +179,23 @@ abstract class ActiveDataProviderTest extends DatabaseTestCase
 | 
				
			|||||||
        $provider->refresh();
 | 
					        $provider->refresh();
 | 
				
			||||||
        $this->assertEquals(2, count($provider->getModels()));
 | 
					        $this->assertEquals(2, count($provider->getModels()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testDoesNotPerformQueryWhenHasNoModels()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $query = new UnqueryableQueryMock;
 | 
				
			||||||
 | 
					        $provider = new ActiveDataProvider([
 | 
				
			||||||
 | 
					            'db' => $this->getConnection(),
 | 
				
			||||||
 | 
					            'query' => $query->from('order')->where('0=1'),
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        $pagination = $provider->getPagination();
 | 
				
			||||||
 | 
					        $this->assertEquals(0, $pagination->getPageCount());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            $this->assertCount(0, $provider->getModels());
 | 
				
			||||||
 | 
					        } catch (InvalidCallException $exception) {
 | 
				
			||||||
 | 
					            $this->fail('An excessive models query was executed.');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->assertEquals(0, $pagination->getPageCount());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										25
									
								
								tests/framework/db/UnqueryableQueryMock.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								tests/framework/db/UnqueryableQueryMock.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace yiiunit\framework\db;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use yii\base\InvalidCallException;
 | 
				
			||||||
 | 
					use yii\db\Query;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UnqueryableQueryMock extends Query
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function one($db = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        throw new InvalidCallException();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function all($db = null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        throw new InvalidCallException();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user