我有两个表,一个用于保存用户数据,另一个用于保存代理数据。我正试图弄清楚如何将某些用户详细信息与机构详细信息进行比较。例如,将口语与所需语言进行匹配。
似乎有很多方法可以做到这一点,现在我只是想弄清楚如何做到这一点。
由于重建旧系统的一个怪癖,旧数据是这样存储的:法语、俄语、中文、泰国、印尼、阿拉伯语、印度、亚洲
这意味着我从一个表中获取数据,必须首先爆炸它
$agency = AgencyLogin::find(196);
$language = $agency->Languages;
$lang = explode(',', $language);
之后我有点困惑,然而,因为然后我需要采取这个机构语言配置文件,并将其与所有用户进行比较,并打印具有语言匹配的用户以及这些匹配是什么。
现在我正在尝试一些非常粗糙的东西,它不适用于不同的信息集:
$ministry = AgencyLogin::find(184);
$prefs = $ministry->Ministry_Preferences;
$tags = explode(',', $prefs);
$sub_categories = DB::table('descriptor')
->whereIn('tag', $tags)
->get(['subcategory', 'description']);
$match = DB::table('users')->select('Ministry_Preferences');
$matches = [];
foreach ($match as $mat) {
$user = explode(',', $mat);
$inter = $tags->intersect($user);
$matches = array_add($matches, $inter);
}
$view->with(['sub_categories', $sub_categories], ['matches', $matches]);
显然,你们中的一些人会看到这一点并说,"不要像那样存储数据,你这个白痴",我同意你的观点,但有很多数据是以这种方式存储的,这意味着我必须重新构建数据库的大部分,正确地链接所有内容,然后编写迁移代码,以便在我们最终上线时将当前运行的数据库正确地迁移到当前本地开发数据库的格式。这将需要一段时间,因为我必须学习如何做每一步,并且可能在这个过程中破坏一些东西,所以……我们先把胶带留着吧
第一种方法
如果您以与代理相同的方式为用户存储语言,我的建议是在语言(在用户表中)字符串的开头和末尾添加,
: ,French,Russian,Mandarin,Thai,Indonesian,Arabic,Indian,Asian,
,这样您就可以构建一个简单的SELECT
查询来在此列中搜索。
更新所有记录的示例查询:
UPDATE table SET languages=CONCAT(',',languages,',') WHERE 1
然后,正如你在问题中所写的,获得代理语言,拆分它们并迭代它们。在此循环中,查询users表以查找与当前语言匹配的用户:
SELECT ... FROM users WHERE language LIKE ('%,:language,%)
或
$agencyLanguage = ','.$agencyLanguage.',';
SELECT ... FROM users WHERE language LIKE ('%$agencyLanguage%)
其中:language是该机构的绑定语言(循环中的众多语言之一)。
另一种方法
如果您当前的DB引擎支持全文搜索,那么您可以将全文索引放在您将搜索的列上(据我所知,这将是users
表中的languages
列)。然后你会得到代理语言,这次不是被,
分解,而是像这样替换:
$agencyLanguages = '+"French" +"Russian" +"Mandarin"';
,然后你可以在搜索查询中使用它:
SELECT * FROM users WHERE MATCH (quote) AGAINST (:agencyLanguages IN BOOLEAN MODE)