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()); }
/** * 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; } }