【问题标题】:How to query whereIn inside json column in laravel 5.3?如何在 laravel 5.3 的 json 列中查询 whereIn?
【发布时间】:2022-01-16 09:58:09
【问题描述】:

我一直在使用 laravel 5.3 版本,在一个表中我有一个 json 列,我在其中保存了一个类别表的平均评分。 因此,产品类别表有一个“详细信息”列作为保存 avgRating 的 json 数据类型。 我想在该 json 列中运行查询。我想以平均评分过滤该类别。因此,从前端评分进来一个以逗号分隔的参数,以便可以使用多个评分过滤类别。

$productCategory = ProductCategory::query();
$ratings = explode(',',$params['ratings']);
$productCategory = $productCategory->whereIn('detail->avgRating',$ratings)->get();

我想实现这样的目标。 我正在使用 Postgres

【问题讨论】:

  • 你用的是什么关系型数据库?
  • @LajosArpad 我正在使用 postgres
  • @LajosArpad 我尝试了$childrenCategories = $childrenCategories->where(DB::raw("detail->>'avgRating' in ('".$ratings."')"));,但没有得到想要的结果。我的意思是空的
  • 直接在Postgres中试用一下。目前尚不清楚问题是在 Postgres 还是 Eloquent 级别。因此,让我们暂时消除 Eloquent,看看原始查询是否有效。

标签: php json laravel postgresql


【解决方案1】:

事实证明,在提出问题的时候存在太多的不确定性。一旦提问者分离问题并找出原始查询

DB::select(DB::raw("SELECT * FROM product_categories where detail->>'avgRating' in ('2.0','4.0')"));

在 Postgres 中工作,从那时起,提问者更容易在 where 子句中找出​​实际的解决方案。我假设它是

detail->>avgRating

而不是

detail->avgRating

但来自尚未确认的评论部分。但是这个故事的寓意是,每当有人遇到可能与 RDBMS 相关的雄辩问题时,首先理清原始查询然后对应该生成什么有扎实的了解是很有意义的第一点可以切换到 Eloquent 代码并在那里应用解决方案。

【讨论】:

  • 另外,不要忘记引用这样的详细信息->>'avgRating' 否则它会将 avgRating 视为单独的列并引发类似未定义列的错误
【解决方案2】:

您应该使用whereJsonContainswhereRaw

$productCategory->whereJsonContains('detail->>avgRating',$ratings)->get();

$productCategory->whereRaw('JSON_CONTAINS(detail->>avgRating, ?)', $ratings)->get();

【讨论】:

  • laravel 5.3 不支持 "whereJsonContains" 。另一个查询不起作用。它说未定义列 avgRating
  • 感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多