Связная логика использования SoftDeleteable

Каждый знает, что SoftDeleteable такое расширение доктрины:

Это позволяет поведению «мягко удалять» объекты, фильтруя их при
ВЫБЕРИТЕ время, отметив их отметкой времени как, но не явно
удаляя их из базы данных.

Теперь, учитывая это, какая логика была бы последовательной при вставке новых строк в таблицу и принятии вышеупомянутых помеченных как удаленных, но находящихся там физически?

Дело в том, что недавно я был вынужден использовать это поведение в приложении, но когда я вставляю новые записи, и логически, когда они существуют, я получаю такую ​​ошибку:

Возникла исключительная ситуация при выполнении «INSERT INTO fos_user (имя пользователя,
username_canonical, электронная почта, email_canonical, включена, соль, пароль,
last_login, заблокирован, срок действия истек, expires_at, подтверждение_кокен,
password_requested_at, роли, credentials_expired,
credentials_expire_at, удаленный, созданный, обновленный,) ЗНАЧЕНИЯ
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ‘с параметрами [«admin1» «admin1″ » admin «,» admin «, 1,» 8ycal2x0eewwg0gw0o0gcw884ooossg «,
«886mLvLTi1yPdSBTR9Cfi + + a3lvideQ4pw89ZHDOWVz86kJqXjx7C1
1ZIwTvzET7N1Fk \ / yHsw10z3Cjm9k + m \ / g == «, ноль, 0, 0, ноль,
ноль, ноль, ‘a: 2: {i: 0; s: 16: \ «ROLE_PROFILE_ONE \» i: 1, s: 16: \
«ROLE_PROFILE_TWO \»;} «, 0, ноль, ноль,» 12.09.2014 18:16:01
«» 12.09.2014 18:16:01 «]:

SQLSTATE [23000]: ограничение целостности Нарушение: 1062 Повторяющаяся запись
‘admin1’ для ключа ‘UNIQ_957A647992FC23A8’

Мой вопрос, как вы справляетесь SoftdDeleteable вводить новые записи? Пример того, что вы делаете, или меньшее количество идей, хорошо бы мне подошло и помогло бы.

1

Решение

Если вы хотите сохранить оригинал, вам нужно найти какой-то способ, чтобы убедиться, что уникальное поле ранее не использовалось. Я думаю, что самый простой способ сделать это — использовать настраиваемый репозиторий для своего пользовательского поля и отключить программный фильтр перед поиском.

По умолчанию UniqueEntity использует findBy и набор репозитория для класса, но имеет смысл создать собственный метод с отключенным по умолчанию фильтром, чтобы избежать необходимости возиться с ограничением, оставляя обычный метод без изменений.

Как вы используете FOSUserBundle (или так кажется из названия таблицы fos_user) вы можете установить repositoryClass в своем отображении (XML — большая куча беспорядка, но вы можете видеть это Вот) …

// Annotation
@ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")

//YAML
Acme\UserBundle\Entity\User:
type: entity
repositoryClass: Acme\UserBundle\Entity\UserRepository

И тогда в вашем UserRepository просто добавь тебя findIncludingSoftdeletedBy метод отключения мягко удаленного фильтра как …

namespace Acme\UserBundle\Entity;

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
/**
* Finds users by a set of criteria including sofdeleted.
*
* @param array      $criteria
* @param array|null $orderBy
* @param int|null   $limit
* @param int|null   $offset
*
* @return array The objects.
*/
public function findIncludingSoftdeletedBy(
array $criteria, array $orderBy = null, $limit = null, $offset = null
)
{
// Get array of enabled filters
$enabledFilters = $this->em->getFilters()->getEnabledFilters();

// If softdeleteable (or soft-deleteable depending on config)
// is in array of enabled filters disable it
if (array_key_exists('softdeleteable', $endabledFilters)) {
// disabled softdeleteable filter ($this->em being entity manager)
$this->_em->getFilters()->disable('softdeleteable');
}

// return regular "findBy" including softdeleted users
return $this->findBy($criteria, $orderBy, $limit, $offset);
}
}

Обновить

Я забыл это немного.

Затем вам нужно будет создать свой собственный файл проверки, который будет ссылаться на это новое ограничение проверки. (Для FOSUserBundle и в YAML (я предпочитаю YAML, XML выглядит так, будто на моем экране болела книга по физике)).

Acme\UserBundle\Entity\User:
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: usernameCanonical
errorPath: username
message: fos_user.username.already_used
// Your method instead of the default "findBy"method: findIncludingSoftdeletedBy
groups: [ Registration, Profile ]
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: emailCanonical
errorPath: email
message: fos_user.email.already_used
// Your method instead of the default "findBy"method: findIncludingSoftdeletedBy
groups: [ Registration, Profile ]

Для получения дополнительной информации об ограничении UniqueEntity см. документы, в частности ..

поля
тип: массив | строка [опция по умолчанию]

Этот обязательный параметр — это поле (или список полей), в котором этот объект должен быть уникальным. Например, если вы указали и поле электронной почты, и имя в одном ограничении UniqueEntity, то это приведет к тому, что значение комбинации будет уникальным (например, два пользователя могут иметь один и тот же адрес электронной почты, если у них также нет одинакового имени) ).

Если вам необходимо, чтобы два поля были индивидуально уникальными (например, уникальный адрес электронной почты и уникальное имя пользователя), вы используете две записи UniqueEntity, каждое из которых имеет одно поле.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]