为什么getQuery会忽略软删除?

时间:2017-04-27 02:42:19

标签: php laravel laravel-5.3

在Laravel中,当我使用getQuery函数根据模型修改我的查询结果时,我得到所有的值,包括softdeleted。它实际上忘记在查询中包含and stock.deleted_at is null。为什么?如何使其过滤掉已删除的记录。

模型

class Stock extends Model
{
  use SoftDeletes;
  protected $dates = ['issue_date', 'expiry_date'];
...

查询(获取按expiry_date分组的股票)

$query = Stock::where('product_id', $id);
$query = $query->getQuery();
$query
    ->select(DB::raw(
        'count(*) as total, 
         DATE_FORMAT(IFNULL(`expiry_date`, "0000-00-00"),"%d-%m-%Y") AS expiry_date '
    ))
    ->groupBy('expiry_date');

$result = $query->get();

我有一个不使用getQuery()的想法,但在这种情况下' issue_date'会给我一条错误信息说" laravel数据丢失"。

1 个答案:

答案 0 :(得分:2)

使用$query->toBase()代替$query->getQuery()

$results = Stock::where('product_id', $id)->toBase()->selectRaw('
    count(*) as total, 
    DATE_FORMAT(IFNULL(`expiry_date`, "0000-00-00"),"%d-%m-%Y") AS expiry_date
')->groupBy('expiry_date')->get();

getQuery方法只返回基础查询,而toBase首先应用所有全局范围(软删除实现为全局范围)。

顺便说一句,您可以直接在Eloquent查询中调用selectgroupBy

$results = Stock::where('product_id', $id)->selectRaw('
    count(*) as total, 
    DATE_FORMAT(IFNULL(`expiry_date`, "0000-00-00"),"%d-%m-%Y") AS expiry_date
')->groupBy('expiry_date')->get();

......虽然这会返回部分Eloquent模型,但这并不总是一个好主意。