Laravel 5.2:Elequent deleted_at Null /!Null with where子句和count

时间:2016-05-07 06:07:40

标签: php laravel laravel-5.2

我正在使用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

表:

Table Data

我错过了什么吗?

2 个答案:

答案 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