我手动使用各种Eloquent函数(即$this->newQuery()->join...)构建了一个大查询,但无法运行。
当我调用时
echo $query->toSql();
它展示给我查询语句。我可以将其复制粘贴到我的命令行mysql客户端中,并且它可以正常运行并返回多行结果。但是当我调用
echo $query->count();
或者
echo $query->get()->count();
显示为0。
最终,我启用了MySQL的常规日志来查看发生了什么。我发现当Laravel运行时,它会执行多个查询-每个查询在日志中都有一行prepare
,接着是一行execute
。但是这个查询没有。
似乎Laravel正在准备语句,但从未执行。为什么呢?
经过多次测试,我已经确定了导致问题的代码行:
$query->having('book_author_author_id', 'NOT IN', DB::raw('('.implode(',',$author_ids).')'));
看起来,包含“having”子句的查询不会被 Laravel 执行,相反它会假装执行并返回一个空集合。发生了什么?