2016-04-12 2 views
1

Работы на Laravel 4.2 приложения (да, это старая программа не стоит модернизации)Laravel дубликат записи после удаления силы

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

Имея вопрос о том, что регистрация нового пользователя не работает, поскольку столбец «email» является уникальным, и запись с мягким удалением все еще существует.

Я бы предпочел создать новую запись пользователя (со всеми остальными полями пустыми), с тем же инкрементирующим ID, чтобы поддерживать отношения с другими мягкими удаленными записями.

Итак, физически удалите старую запись и создайте новую со старым идентификатором? Правильно? Не работает.

Вызов forceDelete() в записи работает, он удаляет его из базы данных, но затем попытка создания новой записи сразу же вызывает исключение «дубликат ключа». Обновление страницы уже не проблема, так как она не видит старую запись.

Похоже, что ошибка исходит от самого MYSQL, хотя php должен ожидать ответа на запрос удаления перед выполнением запроса на вставку, поэтому mysql должен знать в этот момент, что запись была удалена.

Возможно ли, что эта ошибка на самом деле происходит из кэша памяти в Laravel?

Я также использую пакет проверки подлинности Sentinel, если это имеет значение.

Вот основной код:

$found = User::where('email', $email)->first(); 

if ($found->deleted_at) { 

    $old_id = $found->id; 

    $found->forceDelete(); 
    $found->save(); 

    $unique_id = $this->generateUnique(NULL, $first_name . $last_name); 

    $user = Sentinel::registerAndActivate(array(
     'id' => $old_id, 
     'email' => $email, 
     'password' => $password, 
     'first_name' => $first_name, 
     'last_name' => $last_name, 
     'unique_id' => $unique_id, 
     'preferred_lang' => $this->locale, 
    )); 
} 

Это приводит к

SQLSTATE [23000]: Integrity нарушение ограничения: 1062 Дублированный запись '[email protected]' для ключа ' users_email_unique '

Кто-нибудь знает, почему это так? Есть ли простое решение?

ответ

0

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

Я где-то читал, что я должен был назвать

$found->save()

обновить удаленные записи, но до сих пор не работал для меня.

Как ни странно, переключение на

$found->update()

работал.

0

Из документов (https://laravel.com/docs/4.2/eloquent):

Чтобы восстановить мягкую удален модели в активное состояние, используйте метод восстановления:

$user->restore(); 

Чтобы определить, является ли данный экземпляр модели был мягким удален, вы можете использовать порчу метод:

if ($user->trashed()) 
{ 
// 
} 
+0

Извините, я должен был быть более ясным, что я не хотел просто восстанавливать запись. Причина этого заключается в том, что я хочу, чтобы она появилась как новая пользовательская запись, и я создаю историю на основе событий модели. И.Е. восстановление приведет к «обновленной» истории вместо «созданной». –

Смежные вопросы