php - Laravel - 可选的 where 和 whereJsonConatins 无法正常工作
问题描述
PHP 7.2.10
Laravel 5.6.39
$statuses = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
$notStatuses = [14, 15, 16, 17, 18, 19];
$videos = Video::query();
if ( isset( $queryParams['category'] ) ){
$videos = $videos->where('video_category', '=', $queryParams['category']);
}
if ( isset( $queryParams['language'] ) ){
$videos = $videos->where('video_language', '=', $queryParams['language']);
}
$videos = $videos->where(function($query) use($statuses) {
foreach($statuses as $status) {
$query->orWhereJsonContains('video_status_ids', $status);
}
});
$videos = $videos->where(function($query) use($notStatuses) {
foreach($notStatuses as $status) {
$query->whereJsonDoesntContain('video_status_ids', $status);
}
});
$videos = $videos->orderBy('video_priority', 'desc')->latest()->paginate(10);
return $videos;
语言和类别是当前条件下的可选过滤器让我们考虑语言过滤器,如果没有所选语言的视频,即使这样我也会得到状态为 10 和 11 的视频,
如果我将whereJsonContains
在过滤器上方使用,那么它也会给出错误的结果,我应该如何正确使用 whereJsonContains、whereJsonDoesNotContains 和可选的 wheres?
注意:可能有助于正确解决问题
你也可以扭转局面
$statuses = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
$notStatuses = [14, 15, 16, 17, 18, 19];
下图显示了手动标记器印地语视频,但可以看到选择的过滤器是自动标记器和印度尼西亚语。
生成的查询
http://mysite.dev/admin/tagging-in-progress?_token=d4jQOLDixYSEXhMR2z8OihVPQ2ZKTezJhk3tIWJg&category=manual_tagger&language=maltese&video_status=&submit=
是
select * from `videos` where `video_category` = 'manual_tagger' and `video_language` = 'english' and json_contains(`video_status_ids`, 9) or json_contains(`video_status_ids`, 29) order by `video_priority` desc, `created_at` desc limit 10 offset 0
解决方案
更改后尝试:
WhereJsonContains('video_status_ids', $status)
至
whereRaw('JSON_CONTAINS(video_status_ids, "$status")')
但是,最好的方法是标准化数据库结构。
例子:
像表一样发布:
+---------+---------+
| user_id | post_id |
+---------+---------+
| 1 | 1,2 |
| 2 | 1,5 |
+---------+---------+
标准化表格
+---------+---------+
| user_id | post_id |
+---------+---------+
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 5 |
+---------+---------+
我不知道它在你的情况下是否可用。但如果是,那么规范化表
推荐阅读
- c++ - 在地图中查找唯一值
>? - symfony - Symfony 4 swiftmailer 配置问题
- java - 保护Tomcat中的子目录
- algorithm - 您如何将交易或不交易的可能案例选择表示为 ADT?
- html - 如何在 Bootstrap 4 jumbotron 下删除空白
- macos - 0curl:(7)无法连接到服务器
- c# - HttpClient.PostAsync continueWith 未执行
- javascript - 从数据表对象获取列 mData 键
- c++ - 如何分隔这个文本文件?斯托克
- javascript - requestAnimationFrame 似乎在调用 cancelAnimationFrame 后更新变量