动态搜索,生成搜索结果链接(反向路由)



只是拉皮条我的cms并尝试简化一些常规任务,例如搜索。CMS 有许多不同的模块,每个模块都可以用动态路由屏蔽。

整个系统非常可靠且非常灵活,但这是搜索结果页面令人头疼的地方。

为了保持灵活性,我将基本数据扔到我的搜索类中,如下所示:

$search->addTable('content', array('title', 'excerpt', 'body', 'meta_keywords', 'meta_description'));
$search->addTable('event', array('title', 'description', 'tags'));

然后,我的搜索类正在从这些变量生成一个sql查询,这将很好地找到结果(呃,也许"nicely"现在不是最好的词,因为结果集包含来自不同表的行,所以我无法判断哪一行属于哪个表,因为所有结果都在一个数组中)

问题是当我想显示结果页面时,我需要负责为每个结果制作适当的 URL,这非常困难,因为我上面提到的系统灵活性(任何内容/模块都可以被任何东西掩盖)。

我知道我的问题非常本地化,可能太模糊了,无法以目前的形式回答它,所以我会尝试澄清我的问题。我不会问你关于最佳实践或我问题的简单答案,但如果你能为我提供一些关于这些基本问题的好提示,我将不胜感激:

  • 看起来生成单个查询不是最佳方法,因为我无法分辨哪一行属于哪个表(不同的表可能意味着不同的 url 制作方法)。另一种方法是单独查询每个表并将结果存储在多维数组(键的表名)中。AFAIK 在 foreach 循环中查询 sql 不是一种可接受的方法。是否可以标记每个结果行以在单个查询中反映其表名?
  • 如果我不为这些结果制作真实的(屏蔽、路由)网址,但我显示非常基本的网址,如 (example.com/content/nice-url-slug),会损害我的 SEO 吗?谷歌可能会因为重复而惩罚我的网站 - 这对我来说是不行的。

与往常一样,请询问而不是单击关闭,也许我可以进一步澄清这种情况。谢谢你,法布里克。

简短的回答是,做多个查询是完全可以的,只要我们不谈论几十个查询。 这也意味着返回的结果将是一组集合,其结构类似于上面的数组,表名是该表中一组结果的关键。

我必须弄清楚代码中的某个点是组装该数组的。 组装后,您可以遍历它并只查询每个表一次。 在该循环中,您拥有所需的所有上下文:表名。

然后,您将该数组数组返回到正在将其组装成结果的任何客户端。 如果表名足以构造 URL,您就可以开始了。 如果需要有关每个表的详细信息(例如其 ID 列的名称),请构建结果数组以包含有关每个表的所需元数据。

总的来说,看起来你的结构很好,并且试图避免多个查询。 别担心。 多个查询的问题在于,当同一个 *table* 在循环中一遍又一遍地查询时,当这是普遍的设计模式时,然后是性能坦克。

最新更新