Laravel雄辩,搜索一列与文本类似的数组内容(但不铸造模型)

68bkxrlz  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(117)

有一个模型(product_stocks),它有一个名为variant_avi的列,包含类似[21,3]的文本,我想检查它是否包含类似[2,3,14,21]的数组中的任何元素。
product_stocks表迁移的一部分:

$table->text('variant_avi');

我知道最简单的方法是将列转换为数组,但我不能更改模型。
有什么办法吗?

dohp0rv5

dohp0rv51#

一种可能性是使用多个LIKE运算符来检查variant_avi列是否包含数组中的任何值:

$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,这是一个本机功能:

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

相关问题