Laravel不使用'having'子句执行查询

时间:2014-05-31 11:53:41

标签: php mysql laravel-4 eloquent having

我已经使用各种雄辩函数手动构建了一个大型查询(即$ 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不执行子句,而是假装执行它们并返回一个空集合。发生了什么事?

2 个答案:

答案 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) . "')"
);