在使用MariaDB环境下,当在whereHas中使用whereIn时遇到了Bug的故事

出现的环境。

Laravel 8.81.0
MariaDB 10.5.x
PHP 8.1.x

Laravel 8.81.0
MariaDB 10.5.x
PHP 8.1.x

Laravel 8.81.0
MariaDB 10.5.x
PHP 8.1.x

发生了什么事?

在写下面这样的源代码时,(在mysql环境下能够正常运行的情况下)在mariaDB环境中发生了count()能够正常运行而get()不能运行的现象。

====前略====

$tagNames = ['テストタグ1','テストタグ2'];

$searchQuery = Projects::query()
        ->when((!empty($tagNames) && !$searchNoTags), function ($query) use ($tagNames) {
          $query->whereHas('tags', function ($query) use ($tagNames) {
            $query->whereIn('tags.name', $tagNames);
          });
        });

dd($searchQuery->count()); // "100" など正しい件数が表示される
dd($searchQuery->get()); // 0件で出力される

====後略====

解决方案

我在这种情况下通过停止使用whereHas中的whereIn进行字符串搜索(先获取id并将其用于whereIn)来使其正常工作。

====前略====

$tagNames = ['テストタグ1','テストタグ2'];
$tagIds = Tag::whereIn('name', $tagNames)->pluck('id')->toArray(); // 検索用のtags.idの配列を準備

$searchQuery = Projects::query()
        ->when((!empty($tagIds) && !$searchNoTags), function ($query) use ($tagIds) {
          $query->whereHas('tags', function ($query) use ($tagIds) {
            $query->whereIn('tags.id', $tagIds); // idで検索
          });
        });

dd($searchQuery->count()); // "100" など正しい件数が表示される
dd($searchQuery->get()); // count()と同じ100件が出力される

====後略====

关于原因的推测

我一个字都没有把握,但个人觉得可能是mariaDB没有完全实现的部分。
(具体来说,在子查询中用 where xx in (y,z,..) 进行字符串搜索时,可能会有一个bug导致不能输出本查询的结果。)

除了这个问题以外,当使用groupBy时,经常要求明确写出在select中写的所有项目,有时在mysql中可以运行但在mariaDB中却不能运行,所以给人的印象是mysql相对不够灵活。

最后

不如說是關於MariaDB而不是Laravel的話題,就Laravel的編寫方式而言,當出現錯誤時,修復深層嵌套的whereIn字串搜尋可能會有所幫助。希望您能理解其中傳達的訊息。

广告
将在 10 秒后关闭
bannerAds