我已经使用各种雄辩函数手动构建了一个大型查询(即$ 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).')'));
似乎包含“'”的查询laravel不执行子句,而是假装执行它们并返回一个空集合。发生了什么事?
答案 0 :(得分:2)
问题是laravel没有正确解析having子句中的DB :: raw语句。由于它也不允许传递数组,因此具有使用having x in (1,2,3)
编写查询无法实现的实际效果。相反,解决方案是做几个单独的条款。所以在这种情况下,像这样:
foreach($author_ids as $id) {
$query->having('book_author_author_id', '!=', $id);
}
Eloquent功能受限的另一个恼人的例子。
答案 1 :(得分:0)
试试这个:
$query->havingRaw(
"{book_author_author_id} IN ('". implode("','", $author_ids) . "')"
);