Reputation: 21
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
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