该项目的前提是这样的:邮寄的包裹根据其取件和投件位置分配给特定的 express 员。它可以来自一个特定的城市、一个州、一个国家或一个地区(一组国家,在另一个表中设置),然后到这些选择中的任何一个。
此时,我的表格中有包裹信息:
package_id, pickup_city, pickup_state, pickup_country,
dropoff_city, dropoff_state, dropoff_country.
还有一个城市表、一个国家/地区表、一个州/省/自治区表和一个区域表。
我设置“规则”表的方式是设置接送类型(城市、州、国家、地区)、接送国家、接送地点......以及相同的下车地点。
当我尝试确定分配给每个包的规则时,我的问题就出现了。
我最初的想法是获取包裹的取件城市...循环遍历“城市”类型规则...如果没有任何匹配项,则循环遍历“州”规则,然后循环“国家”规则,然后“地区”。如果它与规则匹配,则会循环遍历所有转换规则以查看是否存在匹配项。
所以我现在拥有的是一大堆带有一堆“if/else”循环的代码,我认为它至少可以做得更简单一点。
如果您曾经有过这样的项目,我只是在寻找一些方向。我的开始方式正确吗?我需要重构整个架构吗?有没有更简单的方法将“规则”与包裹的位置相匹配?
感谢您提供的任何帮助。
编辑 为了清楚起见,让我举一个场景...... 一个包裹正从洛杉矶寄往日本东京。在“规则”表中,有以下规则:
+ name + pickup_type + pickup_country + pickup_location + dropoff_type + dropoff_country + dropoff_location +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ US to Asia + country + US + null + region + null + asia_region +
+ US to Japan + country + US + null + country + Japan + null +
+ LA to Japan + city + US + Los Angeles + country + Japan + null +
+ LA to London + city + US + Los Angeles + city + UK + London +
所以第三条规则是适用的。我当前的流程循环遍历接送城市以查找匹配项(#3 和 #4),然后循环遍历接送城市的这些结果...如果找不到任何匹配项,请尝试州,然后是国家/地区,然后地区。
刚才,我在想,“从洛杉矶到澳大利亚是什么?”...我的方式是找到洛杉矶,完成所有工作以循环下车地点,然后必须原路返回上车地点未找到任何内容时的位置。
我确信这一切都清楚如泥。感谢您的任何建议。
编辑2
@shadyyx 我已经显示了规则表,包信息的字段位于顶部...并且规则表还有一个 ID 字段,这就是我想要返回的内容。
还有一个“区域”表,它是键/值对:
+ region_id + country_id +
++++++++++++++++++++++++++
+ 1 + JP +
+ 1 + CN +
+ 2 + US +
+ 2 + CA +
在此场景中,区域 1 是包含日本和中国的亚洲区域,区域 2 是包含美国和加拿大的北美区域
因此,我的流程变为 1) 检查取件城市是否属于规则的一部分,2) 如果不是,请检查取件州是否属于规则的一部分,3) 如果不是,请检查取件国家/地区是否属于规则的一部分规则,最后 4) 如果没有,查看该国家/地区是否列在“regions”表中并获取region_id。一旦找到该规则,然后查看下车规则并在那里找到匹配项。我真的很感谢您的帮助,我会尽力提供所需的尽可能多的信息。再次感谢。
编辑3
经过更多研究,我找到了一个潜在的解决方案,即执行多个 SQL 查询,然后将接送规则的结果放入数组中,然后进行比较。因此要检查城市:
SELECT id FROM rules WHERE pickup_type = 'city' AND pickup_country = '$pu_country' AND pickup_location = '$pu_city';
// put the results into a flat array, then check the countries
SELECT id FROM rules WHERE pickup_type = 'country' AND pickup_country = '$pu_country';
// add those results to the same array... and so on.
然后对 Dropoff 规则执行相同的操作。然后对两个数组运行 array_intersect() 以查找匹配的数组。唯一的问题是,如果存在美国->英国规则和美国->伦敦规则,您如何确定哪一个是最高规则?我想这就是@pjskeptic 的想法的用武之地。
最佳答案
添加一个名为“类型”的字段,对您的下车和上车类型进行排名,其中较低的数字代表更好(更精确)的选项:
- 城市
- 城市/国家
- 国家/城市
- 国家/地区
- 城市/地区
- 地区/城市
- 国家/地区
- 地区/国家
- 地区/地区
由于您要存储城市、国家、州和地区的表,因此您可以在规则表中使用它们的 ID。修改您的规则表以具有类似于以下内容的架构
- 姓名
- 类型(从上方)
- 拾取类型
- pickup_city_id
- pickup_state_id
- pickup_country_id
- pickup_region_id
- drop_type
- drop_city_id
- drop_state_id
- drop_country_id
- drop_region_id
现在,如果您知道您的接送城市和目的地城市,您应该能够从其他表加载它们的州、国家和地区 ID。然后,您可以执行以下查询:
SELECT * FROM rules WHERE ((pickup_type = 'city' && pickup_city_id = '$pickup_city_id') OR
(pickup_type = 'state' && pickup_state_id = '$pickup_state_id') OR
(pickup_type = 'country' && pickup_country_id = '$pickup_country_id') OR
(pickup_type = 'region' && pickup_region_id = '$pickup_region_id')) AND ((drop_type = 'city' && drop_city_id = '$drop_city_id') OR
(drop_type = 'state' && drop_state_id = '$drop_state_id') OR
(drop_type = 'country' && drop_country_id = '$drop_country_id') OR
(drop_type = 'region' && drop_region_id = '$drop_region_id')) ORDER BY type ASC
该查询将查找与您的投递城市、州、国家或地区以及您的接载城市、州、国家或地区相匹配的规则。因为您是按类型排序,所以集合中的第一个结果应该是最方便的 express 。
关于php - 尝试使用 PHP 和 MySQL 中的逻辑将某些内容分配给 "rule",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883017/