我有一张名为 Bookings 的表。该表包含表示针对特定服务进行的预订的数据,具有许多变量。
不久前,我遇到了当前数据结构的问题,即影响时间、日期或价格的预订的任何更改都会影响其他相关的财务记录、日期的预订列表等。
我当时的解决方案是创建一个修改表来跟踪对预订所做的任何更改。然后,每当 Booking 模型被要求返回预订时,它都会添加所做的修改(在afterFind()
Cake 回调)并呈现最新版本的预订,如下所示(请原谅 Paint 绘图):
当您要求 Booking 模型返回 booking #1234 时,此方法可以正常工作。它返回预订的最新表示,包括所有修改(彼此分层),包括包含所有修改的数组and原始预订数据供参考。
我的问题是我最近意识到我需要能够使用自定义条件查询此模型,并且如果在其中一项修改中实现了其中一个条件,则结果将不匹配,因为模型正在搜索原始记录而不是比最终呈现的记录。我查询模型以返回行的示例abc
是蓝色(不是灰色):
在该示例中,模型直接查看原始数据中的行,其中abc
是蓝色的并且不返回此结果,因为蓝色值位于附加的修改中after找到原始结果。
我现在所做的是将查询放入beforeFind()
回调 Booking 模型以查找与给定条件匹配的修改,加入预订以确保任何其他条件仍然匹配。当它返回上面示例中的蓝色时,它将结果存储在数组中作为类属性,并继续常规操作find()
, but excludes该预订的 ID 不会被退回(因为我们找到了它的更新版本)。然后它将它们合并在一起,再次对它们进行排序等afterFind()
.
这是可行的,尽管它比我希望的要冗长一些。
毕竟,我意识到在这个应用程序的其他部分,有一些模型手动加入预订表并搜索预订。因此,现在我需要一种方法,能够将修改直接合并到 MySQL 中的表的所有手动联接中,而不影响原始数据,并且最好不要更改太多代码。
我的想法是,我需要删除手动连接并创建模型关联。会不会beforeFind()
and afterFind()
当我查询具有许多预订的客户模型(将修改应用于每个预订)时,预订模型的仍然运行?
我的另一个选择是通过删除修改中可能包含的任何条件,从 MySQL 返回比所需更多的行,然后使用 PHP 根据我的搜索条件过滤结果。这个选项让我有点害怕,因为如果没有这个标准,结果集可能会很大......
我怎样才能实现这个数据结构?我的关键需求仍然是我不想更改原始 Booking 记录,而是在上面添加 Modification 记录,但我需要能够通过模型查询预订(包括修改)。
我想尝试尽可能多地将这种集成保留在幕后,这样我就不必遍历整个应用程序来进行更改n
类似这样的查询数量:
$get_blue = $this->Booking->find('all', array(
'conditions' => array(
'Booking.abc' => 'blue'
)
));
我希望能够隐式包含对预订所做的任何修改,以便在上述查询中返回最新的预订。
另一个问题是当 Booking 模型手动连接到搜索查询时,如下所示:
$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 中手动连接表(修改集成位于before
and afterFind()
Booking 模型的回调函数)。
对此的任何帮助将不胜感激。
Edit
我知道这已经足够长了,但我想我应该补充一点,我想跟踪这些更改而不更新原始记录的原因是金融的方面不能改变,因为它会影响报告。
到目前为止,我能看到的最快、最简单的解决方案是在所有情况下直接对原始预订应用修改,除非它影响财务信息,财务信息仍被跟踪为修改(因为我目前不需要根据此信息进行搜索) )。