Laravel Eloquent - Model :: all()方法给出所有结果,包括软删除

时间:2017-11-08 04:51:12

标签: php laravel laravel-5 eloquent soft-delete

当我使用雄辩的 Model :: all()方法选择所有记录时,它也会给我软删除记录。

模型类

protected $table = 'tr_fl_tax_charges';

protected $primaryKey = 'fl_tax_id';

use SoftDeletes;

protected $softDelete = true;

protected $dates = ['deleted_at'];

控制器类

案例1

public function index()
{

    $tax = Tax::all();

    return $tax;
}

它给了我所有记录,包括软删除行。

案例2

public function index()
{

    $tax = Tax::all()->where('deleted_at' , '=', null);

    return $tax;
}

这种情况给我正确的输出,不包括软删除的行,但它给了我所有列,我不需要所有列。我只需要4列。

案例3

如果我在 all()方法中添加了需要的列名,它也会给我软删除的行。

public function index()
{

    $tax = Tax::all('fl_tax_id','fl_tax_type','fl_tax_name','fl_charge_type','fl_charge_rate')->where('deleted_at' , '=', null);

    return $tax;
}

案例4

如果我在案例3中再添加一列deleted_At,它会给我预期的输出。

public function index()
{

    $tax = Tax::all('fl_tax_id','fl_tax_type','fl_tax_name','fl_charge_type','fl_charge_rate', 'deleted_at')->where('deleted_at' , '=', null);

    return $tax;
}

我想要的是我只想要那些未被软删除的记录以及那些我想要选择列的记录。怎么样?

使用模型和控制器文件进行更新

Tax.php(模型) - 这里BaseModel扩展了Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\SoftDeletes;

class Tax extends BaseModel

{

protected $table = 'tr_fl_tax_charges';

protected $primaryKey = 'fl_tax_id';

use SoftDeletes;

protected $softDelete = true;

//protected $fillable = ['fl_tax_type' , 'fl_tax_name' , 'fl_charge_type' , 'fl_charge_rate'];

protected $guarded = [];

protected $dates = ['deleted_at'];


}

TaxController.php

<?php

namespace App\Http\Controllers;

use App\Models\Tax;
use Illuminate\Http\Request;
use Validator;

class TaxController extends Controller

{

public function index()

{

$tax = Tax::all();

return $tax;

}

3 个答案:

答案 0 :(得分:1)

您需要删除protected $softDelete = true;,只留下use SoftDeletes;即可。

答案 1 :(得分:1)

根据提供的当前信息,案例1没有理由失败。软删除使用all()方法,我没有看到当前提供的代码中的任何其他问题会改变它。如果提供更多代码来揭示问题,我会更新此答案。

案例2&#34;工作&#34;因为您实际上在所有where()条记录的Collection上调用了TaxTax::all()查询数据库并构建所有结果的Collection,然后您使用where()使用空deleted_at字段过滤掉结果。这是非常低效的。

案例3失败,因为您的选择列表不包含deleted_at字段。因此,当您在where()上致电Collection时,只能看到delete_at为空的记录,所有记录都会匹配,因为deleted_at不存在。这仍然在where()上调用Collection,而不是在查询中添加where子句,因此效率很低。

案例4&#34;工作&#34;再次,因为您重新添加了deleted_at字段,因此它将在Collection结果中,并且过滤可以过滤掉deleted_at不为空的记录。但同样,这会过滤所有税务记录PHP Collection,而不是在SQL查询中添加where条件。

答案 2 :(得分:0)

你应该试试这个:

更改您的Tax模型并尝试:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\SoftDeletes;

class Tax extends BaseModel

{
use SoftDeletes;

protected $dates = ['deleted_at'];

protected $table = 'tr_fl_tax_charges';


protected $guarded = ['fl_tax_id','_token'];


}