2017-03-10 7 views
0

ソフト削除されたエンティティをLaravel 4.2で復元しようとしていますが、deleted_atのタイムスタンプを無効な形式に設定し続けます。ソフト削除されたエンティティを復元すると、deleted_at列に無効なタイムスタンプが設定される

NULLに設定する代わりに、0000-00-00 00:00:00に設定し、Laravelが列が空ではないため、Laravelが削除済みとして認識し続けるため、ソフト削除されたエンティティを実際に復元できなくなります。

私は、deleted_at属性へのセッターを使用して試してみましたが、動作しません。

コードは実際には非常に簡単です:私は、ユーザーが復元されたが失敗したように、deleted_at列を無効にするPUT要求を送信します。

// Javascript 
$("#enable-user").on('click', function (event) { 
    var action = $(this).attr('action'); 

    swal({ 
     title: "Are you sure?", 
     text: "Do you want to reactivate this user?", 
     type: "warning", 
     showCancelButton: true, 
     html: true, 
     cancelButtonText: "Cancel", 
     confirmButtonText: "Continue", 
     closeOnConfirm: false, 
     closeOnCancel: true, 
     showLoaderOnConfirm: true 
    }, 
    function(isConfirm) { 
     if (isConfirm) { 
      $.ajax({ 
       type: 'PUT', 
       url: action, 
       headers: { 
        'X-CSRF-Token': $("input[name='_token']").attr('value') 
       }, 
       data: { 
        deleted_at: null 
       }, 
       success: function(data) { 
        sweetAlert("Sii!", "User re-activated successfully!", "success"); 
       }, 
       error: function(jqXHR, textStatus, errorThrown) { 
        if (jqXHR.status === 401) { 
         sweetAlert("Oops...", jqXHR.responseJSON.message, "error"); 
        } else { 
         sweetAlert("Oops...", "Something went wrong!", "error"); 
        } 
       } 
      }); 
     } 
    }); 
}); 
// UsersController 
public function updateUser($userId) 
{ 
    $input = Input::all(); 
    $user = User::withTrashed()->where('id', '=', $userId)->firstOrFail(); 

    if (array_key_exists('exports', $input)) { 
     $user->exportAccounts()->sync([]); 
     $user->exportAccounts()->sync($input['exports']); 
     unset($input['exports']); 
    } 

    if (array_key_exists('regions', $input)) { 
     $user->regions()->sync([]); 
     $user->regions()->sync($input['regions']); 
     unset($input['regions']); 
    } 

    $user->update($input); 

    $user->queueUpdateToAlgolia(); 

    return Response::json([], 200); 
} 

これは、復元後に、データベースに表示されるものである:

database

+0

:これに

public function setDeletedAtAttribute($value) { if ($value === NULL) { $this->attributes['deleted_at'] = null; } else { $this->attributes['deleted_at'] = $value; } } 

? –

+0

私は両方の方法を試みました。 'restore()'もうまくいきません。 – GiamPy

答えて

0

を問題#laravel IRCにhelloNLのおかげで解決されて。

明らかにJavaScriptのNULLはLaravelでは認識されませんが、空の文字列として認識されます。

だから私はこのことから私のモデルセッターを編集する必要がありました:あなたは、モデルの `復元()`メソッドを使用していないのはなぜ

public function setDeletedAtAttribute($value) 
{ 
    if ($value === NULL || $value === "") { 
     $this->attributes['deleted_at'] = null; 
    } else { 
     $this->attributes['deleted_at'] = $value; 
    } 
} 
+0

将来問題が発生する可能性があります。デフォルトでは、MySQL 5.7ではより厳密なフィールド型(MySQLモードSTRICT_TRANS_TABLES)を強制的に使用しますが、これは引き続き手動で無効にすることができます。 例として、NULLが日付ではないため、TIMESTAMPをNULLにすることはできません。 詳細については、こちらをご覧ください:https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html – Sigismund

関連する問題