yii2-redis icon indicating copy to clipboard operation
yii2-redis copied to clipboard

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

Open haohetao opened this issue 4 years ago • 2 comments

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

haohetao avatar Jan 08 '21 06:01 haohetao

@haohetao do you have time for a pull request with some tests (and possibly a fix)?

samdark avatar Jan 11 '21 13:01 samdark

@samdark 我现在比较忙,需要等一或二个月

haohetao avatar Jan 16 '21 06:01 haohetao