/**
  * Attempts to find cached models based on the current query.
  * 
  * @return array
  */
 private function findCachedModels()
 {
     if (!$this->sourceModel || !$this->sourceModel->isCacheing()) {
         return false;
     }
     $uniqueKeys = $this->sourceModel->getUniqueKeys();
     // Early validation allows us to fail immediately on obvious unsupported query types
     if (empty($uniqueKeys) || $this->distinct || $this->limit > 1 || !empty($this->groups) || !empty($this->havings) || !empty($this->orders) || !empty($this->offset) || !empty($this->unions) || !empty($this->joins) || !empty($this->columns) || empty($this->wheres)) {
         return false;
     }
     $query = new SquirrelQuery($this->wheres, $this->sourceObjectDeletedAtColumnName());
     $searchingKey = $query->uniqueKeyString();
     $modelKeys = SquirrelCache::uniqueKeys($this->sourceModel);
     $cacheKeyPrefix = SquirrelCache::getCacheKeyPrefix(get_class($this->sourceModel));
     if (array_key_exists($searchingKey, $modelKeys)) {
         $cacheKeys = $query->cacheKeys($cacheKeyPrefix);
         if (empty($cacheKeys)) {
             return;
         }
         $models = [];
         foreach ($cacheKeys as $key) {
             $model = SquirrelCache::get($key);
             if ($model) {
                 if ($deletedAt = $query->deletedAtObject()) {
                     if (array_key_exists($deletedAt->column, $model)) {
                         if ($deletedAt->value == SquirrelQueryWhere::WHERE_CLAUSE_TYPE_NULL && !empty($model[$deletedAt->column])) {
                             // The query requires the deleted at column be empty
                             return;
                         }
                         if ($deletedAt->value == SquirrelQueryWhere::WHERE_CLAUSE_TYPE_NOT_NULL && empty($model[$deletedAt->column])) {
                             // The query requires the deleted at column have a value
                             return;
                         }
                     } else {
                         // The deleted at column could not be found, so we are not going to return anything
                         return;
                     }
                 }
                 $models[] = (object) $model;
                 continue;
             }
             return;
         }
         return $models;
     }
 }
 public function testSquirrelQueryBasicFindWithSoftDeletes()
 {
     // Test simple case, User::find(1), no softdeletes
     $whereData = [['type' => 'Null', 'column' => 'users.deleted_at', 'boolean' => 'and'], ['type' => 'Basic', 'column' => 'users.id', 'operator' => '=', 'value' => 1, 'boolean' => 'and']];
     $deletedAtColumnName = 'deleted_at';
     $query = new SquirrelQuery($whereData, $deletedAtColumnName);
     $this->assertCount(2, $query->wheres);
     $this->assertEquals("id", $query->uniqueKeyString());
     $cacheKeys = $query->cacheKeys();
     $this->assertCount(1, $cacheKeys);
     $this->assertEquals('a:1:{s:2:"id";s:1:"1";}', $cacheKeys[0]);
     $cacheKeys = $query->cacheKeys("Squirrel::App\\User::");
     $this->assertEquals('Squirrel::App\\User::a:1:{s:2:"id";s:1:"1";}', $cacheKeys[0]);
     $keysWithValues = $query->keysWithValues();
     $this->assertCount(1, $keysWithValues);
     $this->assertArrayHasKey('id', $keysWithValues);
     $this->assertEquals(1, $keysWithValues['id']);
     $deletedAtObject = $query->deletedAtObject();
     $this->assertNotEmpty($deletedAtObject);
     $this->assertEquals("and", $deletedAtObject->boolean);
     $this->assertEquals("deleted_at", $deletedAtObject->column);
     $this->assertEquals("Is", $deletedAtObject->operator);
     $this->assertEquals("Null", $deletedAtObject->value);
     $this->assertEquals("Null", $deletedAtObject->type);
     $fields = $query->allExcludingDeletedAt();
     $this->assertCount(1, $fields);
     $this->assertEquals("and", $fields[0]->boolean);
     $this->assertEquals("id", $fields[0]->column);
     $this->assertEquals("=", $fields[0]->operator);
     $this->assertEquals("1", $fields[0]->value);
     $this->assertEquals("Basic", $fields[0]->type);
     $first = $query->firstWithColumnName("deleted_at");
     $this->assertNotEmpty($first);
     $this->assertEquals("deleted_at", $first->column);
     $this->assertEquals("Is", $first->operator);
     $this->assertEquals("Null", $first->value);
     $first = $query->firstWithColumnName("id");
     $this->assertEquals("id", $first->column);
     $this->assertEquals("=", $first->operator);
     $this->assertEquals("1", $first->value);
     $this->assertEmpty($query->inStatement());
     $this->assertTrue($query->isCacheable());
 }