簡體   English   中英

具有Laravel關系的MySQL嵌套集模型

[英]MySQL Nested Set Model with Laravel Relationships

晚上好!

我正在研究一個應該允許Laravel具有基於MySQL嵌套集模型(lft和rgt鍵)的關系的程序包。

圖例:X,Y,Z,A,B,C是整數。

假設我們想將其與eshop類別一起使用。

我的第一個任務是創建關系。 我設法創建了一個關系,該關系可以找到當前類別的父級。 我的查詢看起來像:

select * from categories where lft < X and rgt > Y order by lft limit 1

這完全正確。 但是,當我要加載100個類別時,就會出現問題。 然后,它是一個針對100個類別的sql查詢:

select * from categories limit 100

和一個SQL查詢每個類別的父級:

select * from categories where lft < X and rgt > Y order by lft desc limit 1

總共有101個 sql查詢。

這是問題所在。 我想使用一種稱為“熱切加載”的技術(將所有關系查詢合並到一個查詢中)。 但是該怎么做呢?

解決方案編號 1

我的第一個解決方案是從以下位置收集所有lft和rgt密鑰:

select * from categories limit 100

並創建如下查詢:

select * from categories where (lft < X or lft < Y or lft < Z ...)
and ( rgt > A or rgt > B or rgt > C ...) order by lft desc

但是,該解決方案根本不起作用。 它返回類別的所有父項。

解決方案編號 2

然后,我嘗試使用此方法使其正常運行。 原始查詢看起來相同。

select * from categories limit 100

但是加載父母是完全不同的:

(select * from categories where lft < X and rgt > Y order by lft desc limit 1)
union all 
(select * from categories where lft < A and rgt > B order by lft desc limit 1)
union all...

該查詢僅返回相關結果,這是完美的,但是要向其子級添加父項,我必須在原始查詢的所有結果中運行(在PHP方面)foreach循環(從類別限制100中選擇*),在該foreach內部,我必須運行另一個對每個父級進行迭代(來自原始查詢),並且在第二個foreach內部,存在一個比較邏輯,該邏輯使10 000(100 * 100)個周期加上comparsion = looooooooooooong執行。

解決方案編號 3

所以我想到了另一種解決方案,我認為這是最好的。 這只是第二種解決方案的改進。

原始查詢:

select * from categories limit 100

關系查詢:

(select categories.*, X as child_lft, Y as child_rgt from categories
where lft < X and rgt > Y order by lft desc limit 1)
union all
(select categories.*, A as child_lft, B as child_rgt from categories
where lft < A and rgt > B order by lft desc limit 1)
union all...

因此,現在,在PHP端,我有一個包含原始查詢結果的數組(100個項目)和一個包含關系查詢結果的數組(100個項目)。 改進之處在於,現在,每個父結果都包含請求它的類別的lft和rgt鍵(child_lft和child_rgt)。 現在,PHP腳本要快得多。 首先,我創建一個包含所有父項的新數組(將其命名為$ parents),每個項目鍵($ parents中的值鍵)都是代碼(child_lft.child_rgt => 1.5),該代碼標識了請求它的類別。 這是一個迭代100次的foreach。 第二個foreach遍歷原始查詢的結果,並檢查$ parents數組是否包含一個值,該值具有適合其lft和rgt鍵的鍵。 因此又有100次迭代。 總共200次迭代=完美! 但是“關系查詢”並沒有我想要的那么快。

那么,還有另一種方法嗎? 或者有沒有辦法在解決方案編號中進行我的sql查詢。 3快?

謝謝您的閱讀。 謝謝!

您可以只使用Baum ,它幾乎可以解決您在Laravel中嘗試做的事情,並且涵蓋了大多數情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM