0

我有这样的代码:

$something_type = $this->db
    ->where('something_type_id', $something->something_type_id)
    ->get('something_types')
    ->row();
if(!$something_type) {
  $something->type = lang('data_not_specified');
} else {
  $something->type = $something_type->something_type_name;
}

// everything is exactly the same here except for one word
$something_category = $this->db
    ->where('something_category_id', $something->something_category_id)
    ->get('something_categories')
    ->row();
if(!$something_category) {
  $something->category = lang('data_not_specified');
} else {
  $something->category = $something_category->something_category_name;
}

...

// and so on, about four times

我想到的一种解决方案是:

$classfications = array('type', 'category');
foreach ($classifications as $classification) {
  $id_property = "something_{$classificiation}_id";
  $something_classification = $this->db
      ->where("something_{$classification}_id", $something->$id_property)
      ->get("something_{$classification}s")
      ->row();
  if(!$something_classification) {
    $something->$classification = lang('data_not_specified');
  } else {
    $name_property = "something_{$classificiation}_name";
    $something->$classification = $something_classification->$name_property;
  }  
}

当然,阅读这可能会导致某人出现不适,那么我该怎么办呢?这可能是一个非常常见的问题,但我无法命名它,所以在谷歌搜索时遇到了麻烦。

4

1 回答 1

1

您在寻找拐点吗?

问题中代码片段的最大挑战是您提供的分类具有不同的复数形式(例如,“类型”变为“类型”,而“类别”变为“类别”)。为了在不变形的情况下构造这些数据,您可以创建一个嵌套数组哈希,例如,

$classifications = array(
  'type' => array(
    'plural' => 'something_types',
    'id'    => 'something_type_id',
  ),
  // etc.
);

foreach ($classifications as $singular => $data) {
  /*
   * Produces:
   * $singluar = 'type';
   * $data['plural'] = 'something_types';
   * $data['id'] = 'something_type_id';
   */
}

但是,我使用的大多数 PHP 框架都包含一个Inflector类(或类似的)来处理语言中的细微差别,这些细微差别使得将单数和复数名称一起使用是有问题的(并且将避免需要嵌套数据结构,如上所述)。

查看CodeIgniter 的 Inflector Helper以了解这意味着什么。如果您已经在使用一个框架(您$db可能会使用帮助程序),那么还要确保查看它是否支持ORM,它会自动处理这种情况。

于 2012-12-09T21:09:38.537 回答