2017-05-17 4 views
0

Ich benutze Laravel 5.4.Laravel soft delete bei Benutzermodell funktioniert nicht

Ich füge Soft-Löschen zum Benutzermodell hinzu.

Wie use SoftDeletes und $dates = ['deleted_at']

Wenn ich User::destroy(1) verwende es tatsächlich deleted_at Wert in der Datenbank hinzufügen, so dass ich bin sicher, dass es kein Setup-Problem über SoftDeletes ist.

Aber wenn ich Benutzerliste und User-Modell zum Login verwenden, wird es keine Zeile gelöscht filtern.

Gibt es jemanden, der das gleiche Problem hat? Bitte sagen Sie mir, wie Sie das lösen.

--Update--

App \ User.php

<?php 

namespace App; 

use Illuminate\Database\Eloquent\SoftDeletes; 
use Illuminate\Foundation\Auth\User as Authenticatable; 
use Illuminate\Notifications\Notifiable; 
use Laravel\Passport\HasApiTokens; 
use Laravel\Scout\Searchable; 

class User extends Authenticatable 
{ 
    /** 
    * Added for passport - api login checking 
    */ 
    use HasApiTokens, Notifiable, Searchable; 

    use SoftDeletes; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 
     'email', 
     'password', 
    ]; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 
    ]; 

    protected $dates = [ 
     'created_at', 
     'updated_at', 
     'deleted_at', 
    ]; 
} 

UserController.php

<?php 

namespace App\Http\Controllers; 

use App\Events\ErrorLog; 
use App\Helpers; 
use App\Http\Controllers\Controller; 
use App\User; 
use Validator; 
use Illuminate\Http\Request; 

class UserController extends Controller 
{ 
    /** 
    * Display a listing of the resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index(Request $request) 
    { 
     $fields = $request->fields ? $request->fields : 
      [ 
       'id', 
       'name', 
       'email', 
      ]; 

     $search = function ($query) { 
      $query->where('name', 'like', '%' . request()->nameOrEmail . '%') 
       ->orWhere('email', 'like', '%' . request()->nameOrEmail . '%'); 
     }; 

     $users = User::where($search) 
      ->orderBy('id') 
      ->paginate(20, $fields); 

     return response()->json([ 
      'status' => 'success', 
      'data' => $users, 
     ]); 
    } 
} 
+0

Sie sollte den Code für das, was Sie hier tun, zur Verfügung stellen: "Aber wenn ich Rufen Sie die Benutzerliste auf und verwenden Sie das Benutzermodell, um sich anzumelden. Die gelöschte Zeile wird nicht gefiltert. " Ohne diesen Code wird es unmöglich sein, Ihre Frage zu beantworten, außer durch Raten. –

+0

Können Sie den Modellcode und den Code teilen, um die Benutzerliste zu erhalten? – Sandeesh

Antwort

4

Soft-Löschfilter nur für eloquent ORM arbeiten

Wenn Sie nicht eloquent dh, wenn Sie Query Builder oder eine rohe SQL Sie für weiche Löschen müssen verwenden manuell überprüfen

Zum Beispiel

$user= User::all(); //eloquent 

ist die gleiche wie

SELECT 
     * 
    FROM 
     users 
    WHERE 
     deleted_at IS NULL 

aber nicht für

$users=DB::table('users') //non eloquent 

, die nur

SELECT * FROM users 

In diesem Fall müssen Sie einige Bedingungen passieren

DB::table('users') 
      ->whereNull('deleted_at'); 

EDIT

Sie Query Builder verwendet haben, die Überschreibung eloquent Zustand, versuchen unter

$users = User::where($search) 
      ->whereNull('deleted_at') 
      ->orderBy('id') 
      ->paginate(20, $fields); 
+0

Ich benutze Benutzer nicht DB :: Tabelle ('Benutzer'), haben Sie irgendwelche Ideen davon? –

+1

ein kleiner Zusatz: 'whereNull ('deleted_at')' ist standardmäßig gemacht, es ist nicht notwendig, es einzuschließen. wenn du die gelöschten Datensätze willst, kannst du auch -> withTrashed() – Christophvh

+0

'whereNull ('deleted_at')' ** sollte ** automatisch gemacht werden, aber in meinem Fall nicht. Könnte ein Fehler in Laravel sein? Ich benutze Version 5.4.22 – Elmer