我有一張名爲Bookings的表格。該表包含代表針對特定服務進行的預訂的數據,其中包含許多變量。有效管理數據變化
前一段我碰到一個問題就來了我目前的數據結構,從而任何更改預訂,影響時間,日期或價格將影響到其他相關的財務記錄,預訂名單的日期等
我的解決方案在現在需要創建一個修改表來跟蹤對預訂所做的任何更改。然後,無論何時預訂模型被要求退回預訂,它都會添加所做的修改(在afterFind()
Cake回調中),並呈現最新的預訂版本,如下所示(原因在於Paint drawing):當你問的預訂模式返回訂票#1234
此方法效果很好。它返回預訂的最新表示形式,包括所有修改(相互分層),包括一個包含所有原始預訂數據的修改和的數組以供參考。
我的問題是,最近我意識到,我需要能夠查詢這種模式自定義條件,如果這些條件之一的修改之一是實現了,其結果將不匹配,因爲該模型正在搜索原始記錄而不是最終呈現的記錄。示例,其中我查詢模型返回行,其中abc
是藍色(未灰色):
在該示例中,模型看起來在直的行的原始數據,其中abc
是藍色,並且不返回這個結果,因爲藍色值是在附加附加的修改中找到了原始結果。
我現在所做的是將一個查詢放入預訂模型的beforeFind()
回調中,查找與給定條件相匹配的修改,加入預訂以確保任何其他條件仍匹配。當它在上面的例子中返回藍色時,它將該結果作爲類屬性存儲在數組中,並繼續使用常規find()
,但不包括從返回的預訂ID(因爲我們發現更新它的版本)。然後它會將它們合併在一起,並在afterFind()
中再次分類。
雖然這是一個更囉嗦,我希望可以。
畢竟,我已經意識到,在這個應用程序的其他部分,有手動加入預訂表和搜索預訂的模型。所以現在我需要一種方法來將所有這些手動連接的修改合併到MySQL中的表中,而不會影響原始數據,並且最好不要更改我的代碼。
我的想法是我需要刪除手動連接並創建模型關聯。當我查詢說有多少訂單的客戶模型(將修改應用到每個預訂)時,預訂模型的beforeFind()
和afterFind()
是否仍然運行?
我的其他選擇是通過刪除修改中可能包含的任何條件,從MySQL返回更多的行,然後使用PHP按照我的搜索條件過濾結果。這個選項讓我有點害怕,因爲結果集有可能是沒有這個標準的龐大數字......
我該如何實現這個數據結構?我的關鍵要求仍然是我不想更改原始預訂記錄,而是在頂部添加修改記錄,但我需要能夠通過模型查詢預訂(包括修改)。
我想嘗試,並保持儘可能多的場面可能這背後的整合,所以我不會要經過我的整個應用程序來改變n
數量的查詢看起來像這樣:
$get_blue = $this->Booking->find('all', array(
'conditions' => array(
'Booking.abc' => 'blue'
)
));
我希望能夠隱含地包含對預訂進行的任何修改,以便在上述查詢中返回最新的預訂。
另一個問題是,當預訂模型手工加入到搜索查詢,像這樣:
$get_transactions_on_blue_bookings = $this->Transaction->find('all', array(
'joins' => array(
array(
'table' => 'sql_bookings_table', // non-standard Cake format, I know - it's an example
'alias' => 'Booking',
'type' => 'LEFT',
'conditions' => 'Booking.booking_id = Transaction.booking_id'
)
),
'conditions' => array(
'Booking.abc' => 'blue'
)
));
正如你所看到的,上面的查詢將不包括在上面我MSPAINT例如修改,因爲它是用SQL手動加入表格的(修改集成在Booking模型的before
和afterFind()
回調函數中)。
任何幫助,將不勝感激。
編輯
我知道這是足夠長的時間了,但我想我補充一點,我之所以要跟蹤這些變化,而不是更新的原始記錄是,金融方面不能改變,因爲它會影響報告。
迄今爲止我所能看到的最快最簡單的解決方案是在所有情況下直接對原始預訂進行修改,除非財務信息仍然作爲修改進行跟蹤(因爲我目前不需要搜索基於這個信息)。
最近我們遇到了一個類似的問題,那就是舊的數據結構不適合用途。我們嘗試了在頂部添加圖層來處理更改的方法,但最終會產生太多的錯誤。最後,我們從頭開始重新設計了數據結構,並編寫了CLI導入程序來移動所有現有數據。這樣做意味着我們可以緩慢地將面向客戶端的功能移動到新系統中,因爲數據正在被跟蹤。當我們對新系統完全滿意時,我們只需從項目中刪除遺留代碼。希望有所幫助。 –
@orciny確實有幫助。我想我們最終將不得不重新設計這種方式。 –