当我使用雄辩的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'];
}