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



当我使用雄辩的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扩展了模型

<?php
namespace AppModels;
use IlluminateDatabaseEloquentSoftDeletes;
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 AppHttpControllers;
use AppModelsTax;
use IlluminateHttpRequest;
use Validator;
class TaxController extends Controller
{
public function index()
{
$tax = Tax::all();
return $tax;
}

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

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

情况2"有效",因为您实际上是在所有Tax记录的Collection上调用where()Tax::all()查询数据库并构建所有结果的Collection,然后使用where()筛选出具有空deleted_at字段的结果。这是非常低效的。

情况3失败,因为您的选择列表不包含deleted_at字段。因此,当您在Collection上调用where()只查看delete_at为空的记录时,由于deleted_at不存在,所有记录都将匹配。这仍然在Collection上调用where(),而没有向查询添加where子句,因此效率低下。

情况4再次"工作",因为您在中添加了deleted_at字段,因此它将出现在Collection结果中,并且过滤可以过滤出deleted_at不为空的记录。但同样,这是在PHP端过滤所有税务记录的Collection,而不是在SQL查询中添加where条件。

你应该试试这个:

更改您的Tax型号并尝试:

<?php
namespace AppModels;
use IlluminateDatabaseEloquentSoftDeletes;
class Tax extends BaseModel
{
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $table = 'tr_fl_tax_charges';

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

}

最新更新