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");
请注意,如果您启用了软删除,您还需要过滤掉子查询中的软删除项。
我有以下两个表:
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");
请注意,如果您启用了软删除,您还需要过滤掉子查询中的软删除项。