php - 为什么 getQuery 忽略软删除?

标签 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'];
...

查询(获取按到期日期分组的股票)

$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 数据丢失”。

最佳答案

使用$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 模型,但这并不总是一个好主意。

关于php - 为什么 getQuery 忽略软删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43647763/

相关文章:

php - Laravel 5.4 替换文件(如果存在)

php - 找不到 Laravel 5 路由对象

php - Laravel 将数组放入选择框

Laravel - Eloquent 连接

php - Laravel 通过关系搜索

php - Mysql 查询针对类别显示同一列两次

php - 模型类的 "save"方法工作时间很长

php - 尝试输出存储在 MySql 中的记录时出现问题

c# - 发布有效数据后从 C# 下载文件

php - Laravel 错误 : Uncaught ReflectionException: Class App\Http\Kernel does not exist