php - 尝试使用 PHP 和 MySQL 中的逻辑将某些内容分配给 "rule"

标签 php mysql logic

该项目的前提是这样的:邮寄的包裹根据其取件和投件位置分配给特定的 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 的想法的用武之地。

最佳答案

添加一个名为“类型”的字段,对您的下车和上车类型进行排名,其中较低的数字代表更好(更精确)的选项:

  1. 城市
  2. 城市/国家
  3. 国家/城市
  4. 国家/地区
  5. 城市/地区
  6. 地区/城市
  7. 国家/地区
  8. 地区/国家
  9. 地区/地区

由于您要存储城市、国家、州和地区的表,因此您可以在规则表中使用它们的 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/

相关文章:

c - C中 float 的准确精度

mysql - 无法连接到 mysql 服务器错误 : mysqld. sock' (38)

php - 从具有多个要求的两个表中选择值,但只使用其中一个

c# - 将 1,2,3,4,5,6,8,10,11 显示为 1-6,8,10-11

php - 访问函数返回的数组

MySQL 选择计数

c++ - 如何在位级别上进行操作?

php-ini - 'local value' 和 'master value' 有什么区别?

php - CodeIgniter Mysql 日期

php - 带有数据库的 Codeigniter 下拉菜单