这是indexloc提供的服务,不要输入任何密码
Skip to content

Баг. Очистка $newPKs от null #51

@matiosfree

Description

@matiosfree

Привет. Буквально на первых парах нашел баг. Описываю кейс:

В базе есть категории с ID: 1, 2, 3, 4.

Шаг 1. Присваиваем категории

$game = Post::model()->findByPk(2);
$game->categories= array(2, PostCategories::model()->findByPk(3));
$game->save()

У нас получается

$game->categories = array(2, 3); //Все ок, в базе все сохранилось хорошо

Шаг 2. Теперь присваеваем несуществующую категорию (да да, несуществующую, данным же нельзя доверять):

$game = Post::model()->findByPk(2);
$game->categories= array(2, PostCategories::model()->findByPk(5));
$game->save()

И вот тут нас получается

$game->categories = array(2, null);

А в базе получится:
id | post_id | category_id
1 | 2 | 2
2 | 2 | 3
3 | 2 | 0

Теперь если каждый раз повторять шаг 2, То будет появляться новая запись с category_id = 0

Шаг 3. Если присвоит такие категории:

$game->categories= array(1, PostCategories::model()->findByPk(5));

То в базе будет:

А в базе получится:
id | post_id | category_id
1 | 2 | 2
2 | 2 | 3
3 | 2 | 0
3 | 2 | 1
3 | 2 | 0

Как видно, старые связи не удалились.

=== Решение ===

Для

$pks[]=is_object($record) ? $record->getPrimaryKey() : $record;

Добавить проверку:

if ($record !== null)

и хорошо бы добавить

return array_unique($pks);

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions