如何使用从 laravel 中的数组中获取的各种术语进行 mysql 关联查询

Posted

技术标签:

【中文标题】如何使用从 laravel 中的数组中获取的各种术语进行 mysql 关联查询【英文标题】:How to do a mysql affinity query with various terms taken from an array in laravel 【发布时间】:2020-12-23 06:06:20 【问题描述】:

我有一个索引有 16 个术语的数组,我需要 mysql 来查找与这 16 个术语或其中至少一个术语相关或对应的文章。

在 laravel 中没有“IN”,有“whereIn”,他只接受一个字符串,我无法创建一个包含 16 个术语的字符串,因为他不识别逗号,我使用的是 php 7.4并且容忍度似乎更低。我试图用implode()将数组转换成字符串,但它不起作用,它返回一个“将数组转换为字符串”错误,查看文档我发现了一些与集合相关的东西,但是,它不接受,它确实必须是一个字符串。我尝试使用 orWhere ,虽然它不返回错误,但它不显示结果并且需要很长时间来处理。 该数组是标准模型中的索引数组:

数组(['1', '2', '3' ...]);

除了条款,我还需要检查文章是否来自当前用户,这是有效的,记住数组及其内容是固定的,在控制器中。

  $link = (['title', 'category', 'description', 'body', 'jobs', 'colors', 'phone', 'about', 'shopping', 'trade', 'costumers', 'author', 'online', 'cloud', 'technology', 'company']);
            $linkt = My::where('id', $user->id)->whereIn($link);

    $linkt = My::where('id', $user->id)->whereIn('from', 'LIKE', '%' . $link);

$test = implode(",", $link);
$linkt = My::where('id', $user->id)->whereIn($test);

这些东西不适合我。

【问题讨论】:

Laravel whereIn 接受一个数组...例如:$users = DB::table('users') ->whereIn('id', [1, 2, 3]) ->get(); 我不能包括整个控制器,但我会把搜索功能和数组放在问题中 whereIn的第一个参数需要是列名。您要匹配的值的第二个参数数组。 ParseError 语法错误,意外',' (whereIn('from', $link);) 没用,你觉得把数组放在whereIn()里面比较好?跨度> 即使把数组放在 whereIn() 里面也返回一个空数组 [],我有 10 个结果对应这些词,它们在一个文本中,在 from 列中,它们是不同的记录。 【参考方案1】:

既然您正在构建一个搜索查询,为什么不在遍历链接(搜索词)数组后构建查询?

类似这样的:

$link = (['title', 'category', 'description', 'body', 'jobs', 'colors', 'phone', 'about', 'shopping', 'trade', 'costumers', 'author', 'online', 'cloud', 'technology', 'company']);

$link = collect($link);

$query = My::where('id', $user->id)->where('from', 'like', '%'.$link[0].'%';

$link->shift(); // remove first element since it's used

$link->each(function($item) use ($query)
  $query->orWhere('from', 'LIKE', '%'.$item.'%'); //assuming that 'from' is your column name
 );

$query->get(); //to retrieve the results

另一种选择是使用whereRaw 发送通过内爆数组推导出的原始语句。像这样的:

$link = ([..]); //link array
$linkImploded = implode("%' OR '%", $link);
$finalLikeStatement = "from LIKE '%$linkImploded%'";

My::where('id', $user->id)->whereRaw($finalLikeStatement)->get(); 

【讨论】:

谢谢,这可行,但我担心由于多个请求导致的循环会减慢应用程序的速度,我当然必须为此创建一个队列,我会在之前看到更多关于它的内容实施它。 添加了另一个选项。但是,如果您担心性能,LIKE 可能不是您想要的方法。我建议查看全文搜索。 我忘了问,每个学期只产生一个结果,我怎样才能把它们全部找回来? get() 返回所有匹配项。如果您得到 1 个结果,则可能意味着有一个结果符合所有这些条件。为了确保,为什么不在 mysql 客户端中运行原始查询,看看它是否会产生更多结果? 这一行给我报错,好像是mysql的版本不兼容,我正在找类似的东西可以测试。 -> $finalLikeStatement

以上是关于如何使用从 laravel 中的数组中获取的各种术语进行 mysql 关联查询的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Laravel 中的数组中获取特定的数组值

如何使用 laravel 和 mysql 数据库获取数组中的数组?

如何使数组从laravel中的数据库中获取数据

当我们压缩到视图时,如何对从控制器获取的 JSON 数组中的数据求和(Laravel)

如何将数组从 Laravel Blade 传递到 Laravel 6/Vue 2.6 中的 Vue 组件。*

从 laravel 中的数组中获取特定值