yiisoft / yii2-redis

Yii 2 Redis extension.
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
452 stars 183 forks source link

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

Open haohetao opened 3 years ago

haohetao commented 3 years ago

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
samdark commented 3 years ago

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

haohetao commented 3 years ago

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