Skip to content

Calling deleteAll() after modifying a PrimaryKey definition cannot delete old data #219

@haohetao

Description

@haohetao

What steps will reproduce the problem?

add Data
change primaryKey
deleteAll()

What's expected?

Expected the find()->all() is empty
but,calling find()->all() the data is still

What do you get instead?

Refactoring deleteAll()
\yii\redis\LuaScriptBuilder

    /**
     * @param string $modelClass className
     * @param mixed $condition
     * @return int
     */
    public function delete($modelClass, $condition)
    {
        $columns = [];
        if ($condition !== null) {
            $condition = $this->buildCondition($condition, $columns);
        } else {
            $condition = 'true';
        }
        
        $key = $this->quoteValue($modelClass::keyPrefix());
        $recordKey = $this->quoteValue($modelClass::keyPrefix() . ':a:');
        return <<<EOF
local allpks=redis.call('LRANGE',$key,0,-1)
local count=0
for k,pk in ipairs(allpks) do
    if $condition then
        redis.call('LREM', $key, 0, pk)
        count=count+redis.call('DEL', $recordKey .. pk)
    end
end
return count
EOF;
    }

\yii\redis\ActiveRecord

    /**
     * Deletes rows in the table using the provided conditions.
     * WARNING: If you do not specify any condition, this method will delete ALL rows in the table.
     *
     * For example, to delete all customers whose status is 3:
     *
     * ~~~
     * Customer::deleteAll(['status' => 3]);
     * ~~~
     *
     * @param array $condition the conditions that will be put in the WHERE part of the DELETE SQL.
     * Please refer to [[ActiveQuery::where()]] on how to specify this parameter.
     * @return int the number of rows deleted
     */
    public static function deleteAll($condition = null)
    {
        $db = static::getDb();
        $script = $db->getLuaScriptBuilder()->delete(static::class, $condition);
        return $db->executeCommand('EVAL', [$script, 0]);
    }

Additional info

Q A
Yii vesion 2.0.40
PHP version 8.0.1
Operating system docker

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions