2011-05-12 108 views
0

只是pimping我的CMS,並試圖簡化一些常見的任務,如搜索。 cms有很多不同的模塊,每個模塊都可以用動態路由屏蔽。動態搜索,產生搜索結果鏈接(反向路由)

整個系統是非常穩固,真正靈活,但是這是在搜索結果頁面是造成頭痛。

爲了保持靈活我要把基本數據,以我的搜索類是這樣的:

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

然後,我的搜索類生成從這些變量一個 SQL查詢,這將很好地找到結果(呃,可能'很好'現在不是最好的詞,因爲結果集包含來自不同表的行,所以我不能分辨哪個行屬於哪個表,因爲所有結果都在單個數組中)

問題是我想要顯示的時候ay結果頁面我需要照顧爲每個結果創建適當的URL,這是非常困難的,因爲我上面提到的系統靈活性(任何內容/模塊都可以用任何東西掩蓋)。

我明白我的問題是非常局部的,也許太含糊回答在其目前的形式,所以我會盡力澄清我的問題有點。我不問你的最佳做法或簡單回答我的問題,但我會非常感激,如果你能提供給我一些好的建議對這些基本問題:

  • 貌似生產單一查詢ISN」最好的辦法,因爲我不知道哪一行屬於哪個表(不同的表可能意味着不同的網址製作方法)。另一種方法是分別查詢每個表並將結果存儲在多維數組中(密鑰的表名)。 AFAIK在foreach循環中查詢sql不是可接受的方法。是否有可能標記每個結果行以在單個查詢中反映它的表名?
  • 將它傷害了我的SEO,如果我不會手藝真正的(屏蔽,路由)對這些結果的網址,但我顯示非常基本的像(example.com/content/nice-url-slug)。 Google可能會因爲重複而懲罰我的網站 - 這對我來說並不合適。

一如既往,請問,而不是點擊關閉,也許我可以澄清情況多一點。謝謝fabrik。

回答

1

簡單的答案是,只要我們不說幾十條,就可以完成多個查詢。這也意味着返回的結果將成爲一組結構,與上面的數組結構一樣,表名是該表中一組結果的關鍵。

我必須指出,在數組組合的代碼中有一點。組裝完成後,您可以循環查看每個表格一次。在該循環中,您擁有所有您需要的上下文:表名稱。

然後,您將該數組數組返回給任何客戶端將其組裝到結果中。如果表名就足以構建URL,那麼你很有必要去做。如果您需要有關每個表的更多信息(例如其ID列的名稱),請構造結果數組以包含有關每個表的所需元數據。

總體而言,它看起來像你有這個結構很好,越來越絆倒試圖避免多個查詢。別擔心。多個查詢的問題是,在循環中反覆查詢相同的 * table *,這是普遍的設計模式,然後是性能坦克。