Skip to content

Commit

Permalink
Refactoring Model::exists() to be independent of Model::$useTable. Fixes
Browse files Browse the repository at this point in the history
 #199.

Model::exists() now makes no check whatsoever on the value of
Model::$useTable. This means that, as with a database-backed dbo,
Model::exists() will call Model::find('count') (which in turn calls
DataSource::read()) to determine if the record identified by Model::$id
already exists in the datasource.
  • Loading branch information
jperras committed Jan 14, 2010
1 parent 199a14f commit adb0c80
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
6 changes: 5 additions & 1 deletion cake/libs/model/model.php
Original file line number Diff line number Diff line change
Expand Up @@ -2006,11 +2006,15 @@ function __collectForeignKeys($type = 'belongsTo') {
/**
* Returns true if a record with the currently set ID exists.
*
* Internally calls Model::getID() to obtain the current record ID to verify,
* and then performs a Model::find('count') on the currently configured datasource
* to ascertain the existence of the record in persistent storage.
*
* @return boolean True if such a record exists
* @access public
*/
function exists() {
if ($this->getID() === false || $this->useTable === false) {
if ($this->getID() === false) {
return false;
}
$conditions = array($this->alias . '.' . $this->primaryKey => $this->getID());
Expand Down
26 changes: 25 additions & 1 deletion cake/tests/cases/libs/model/model_integration.test.php
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ function testLoadModelSecondIteration() {
}

/**
* ensure that __exists is reset on create
* ensure that exists() does not persist between method calls reset on create
*
* @return void
*/
Expand All @@ -897,6 +897,30 @@ function testResetOfExistsOnCreate() {
$this->assertEqual($result['Article']['title'], 'Staying alive');
}

/**
* testUseTableFalseExistsCheck method
*
* @return void
*/
function testUseTableFalseExistsCheck() {
$this->loadFixtures('Article');
$Article =& new Article();
$Article->id = 1337;
$result = $Article->exists();
$this->assertFalse($result);

$Article->useTable = false;
$Article->id = null;
$result = $Article->exists();
$this->assertFalse($result);

// An article with primary key of '1' has been loaded by the fixtures.
$Article->useTable = false;
$Article->id = 1;
$result = $Article->exists();
$this->assertTrue($result);
}

/**
* testPluginAssociations method
*
Expand Down

0 comments on commit adb0c80

Please sign in to comment.