有一个模型(product_stocks),它有一个名为variant_avi的列,包含类似[21,3]的文本,我想检查它是否包含类似[2,3,14,21]的数组中的任何元素。product_stocks表迁移的一部分:
product_stocks
variant_avi
[21,3]
[2,3,14,21]
$table->text('variant_avi');
我知道最简单的方法是将列转换为数组,但我不能更改模型。有什么办法吗?
dohp0rv51#
一种可能性是使用多个LIKE运算符来检查variant_avi列是否包含数组中的任何值:
LIKE
$values = [2, 3, 14, 21]; $results = ProductStock::where(function($query) use ($values) { foreach ($values as $value) { $query->orWhere('variant_avi', 'like', "%{$value}%"); } }) ->get();
请记住,使用LIKE运算符可能不如将列转换为数组更有效。如果可能,最好更改模型并将variant_avi列转换为数组,以便可以使用更有效的数组比较运算符。如果您无法更改该模型,但上述解决方案会产生性能问题,我建议您构建另一个表作为示例化视图。构建示例化视图将variant_avi列存储为JSON是一个很好得解决方案,因为这样可以在不更改原始模型得情况下使用更有效得数组比较运算符.如果您正在使用Postgres,这是一个本机功能:
JSON
DB::statement('CREATE MATERIALIZED VIEW product_stocks_json AS SELECT id, variant_avi::JSON AS variant_avi FROM product_stocks ');
在MySQL中,它需要做一些额外的工作:https://fromdual.com/mysql-materialized-views您还可以利用Laravel中的模型事件来保持单独的表处于最新状态:https://laravel.com/docs/9.x/eloquent#events
1条答案
按热度按时间dohp0rv51#
一种可能性是使用多个
LIKE
运算符来检查variant_avi
列是否包含数组中的任何值:请记住,使用LIKE运算符可能不如将列转换为数组更有效。如果可能,最好更改模型并将variant_avi列转换为数组,以便可以使用更有效的数组比较运算符。
如果您无法更改该模型,但上述解决方案会产生性能问题,我建议您构建另一个表作为示例化视图。
构建示例化视图将
variant_avi
列存储为JSON
是一个很好得解决方案,因为这样可以在不更改原始模型得情况下使用更有效得数组比较运算符.如果您正在使用Postgres,这是一个本机功能:
在MySQL中,它需要做一些额外的工作:https://fromdual.com/mysql-materialized-views
您还可以利用Laravel中的模型事件来保持单独的表处于最新状态:https://laravel.com/docs/9.x/eloquent#events