Laravel whereIn 没有给出想要的结果

Laravel whereIn not giving desired result

我有以下两个表:

unotes    unote_unit
======    ==========
id        unote_id
notes     unit_id

我正在尝试检索 unotes 行,其相关 unit_id 列与输入数组完全匹配。

所以,我 运行 以下查询:

$unote = UNote::whereHas('units', function ($query) use ($request) {
        $query->whereIn('units.id', $request->unit_lists);
    })
    ->withCount('units')
    ->having('units_count', '=', $u_list_count)
    ->get()
    ->pluck("id");

但是,上述查询的问题在于,即使只有一个匹配 unit_id,它也会检索数据。例如我有以下数据集:

unotes //with related unit_id
========
id = 3 //49865, 49866, 49867
id = 4  //49865, 49866

使用上面提到的代码,如果我传递 [49866,55555],它应该 return 除了它 returns ids 3 和 4,其中包含一个匹配但不是全部。

我也在 Laracasts 上发现了类似的问题,但是 运行 查询 returns Cardinality violation: 1241 Operand should contain 2 column(s):

$unote = UNote::with('units')
    ->whereHas('units', function ($query) use ($request) {
        $query->selectRaw("count(distinct id)")->whereIn('id', $request->unit_lists);
    }, '=', $u_list_count)
    ->get()
    ->pluck("id");

我也找到了类似的问题,但是好像太贵了。

这是开始的虚拟 SQL:http://sqlfiddle.com/#!9/c3d1f7/1

因为 whereHas 只是将一个 WHERE EXISTS 子句添加到具有您指定的过滤器的查询中,所以 whereIn 对于任何匹配确实 return 为真。您可以尝试的一件事是 运行 获取设备 ID 列表并进行比较的原始子查询。

$search_ids = [49866, 49865];
sort($search_ids);
$search_ids = implode(",", $search_ids);

Unote::select("id")
    ->whereRaw(
        "(SELECT GROUP_CONCAT(unit_id ORDER BY unit_id) FROM unote_unit WHERE unote_id = unotes.id) = ?",
        [$search_ids]
    )
    ->get()
    ->pluck("id");

请注意,如果您启用了软删除,您还需要过滤掉子查询中的软删除项。