Yu Ch Chien
Yu Ch Chien

Reputation: 21

Laravel soft delete at User model not working

I'm using Laravel 5.4.

I add soft delete to User model.

Like use SoftDeletes and $dates = ['deleted_at']

When I use User::destroy(1) it will actually add deleted_at value in database, so I'm sure there is no setup problem about SoftDeletes.

But when I get user list and use User model to login, it won't filter deleted row.

Is there any one have the same problem? Please tell me how you solve this.

--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,
        ]);
    }
}

Upvotes: 1

Views: 7956

Answers (1)

sumit
sumit

Reputation: 15464

Soft deletion filter only work for eloquent ORM

If you don't use eloquent i.e if you are using query builder or some raw sql you need to check for soft deletion manually

For example

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

is same as

 SELECT 
      * 
    FROM
      users
    WHERE
      deleted_at IS NULL 

but not for

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

which is just

SELECT * FROM users

In this case you need to pass some conditions

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

EDIT

You have used query builder which override eloquent condition, try below

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

Upvotes: 7

Related Questions