我正在使用eloquent根据条件获取一些记录。
$completed = Task::where('user_id', Auth::user()->id)->where('deleted_at', '=', !Null)->get()->count();
$incompleted = Task::where('user_id', Auth::user()->id)->where('deleted_at', '=', Null)->get()->count();
第一个返回0
这是正确的。
但是第二个返回0
,而应该是1
。
表:
我错过了什么吗?
答案 0 :(得分:2)
假设您在任务模型中使用SoftDeletes的方式与此类似:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Task extends Model
{
use SoftDeletes;
然后您的查询应如下所示:
$completed = Task::where('user_id', Auth::user()->id)->onlyTrashed()->get()->count();
$incompleted = Task::where('user_id', Auth::user()->id)->get()->count();
onlyTrashed方法返回填充deleted_at的记录,但不包括deleted_at为null的记录。
还有一个withTrashed方法,它返回填充了deleted_at的记录以及deleted_at为null的记录。
作为一般规则,您应该避免在使用SoftDeletes时直接查询deleted_at列,而是使用提供的方法。默认情况下,将排除已填充deleted_at的所有记录。
您还应该确保在迁移中使用了softDeletes()方法,以便在数据库中正确设置该列。
答案 1 :(得分:0)
假设,正如您所说,您正在使用软删除,您无需执行任何特殊操作即可返回所有未删除的记录:
$completed = Task::where('user_id', Auth::user()->id)
->get()
->count(); // according to your DB screenshot this should be '3'
要获取 软删除,请使用onlyTrashed()
:
$notCompleted = Task::where('user_id', Auth::user()->id)
->onlyTrashed()
->get()
->count(); // according to your DB screenshot this should be '2'
获取所有记录:
$tasks = Task::where('user_id', Auth::user()->id)
->withTrashed()
->get()
->count(); // according to your DB screenshot this should be '5'
更多信息:https://laravel.com/docs/5.2/eloquent#querying-soft-deleted-models