ZF2全局函数从任何SQL表中提取数据

时间:2014-02-27 09:17:15

标签: function content-management-system zend-framework2 global

Rob Allen在Getting Started with Zend Framework 2的专辑收集教程中对ZF2进行了很好的介绍。在他的模块中,模型看起来像这样:

  // ...
  class Albums
  {
      public $id;
      public $artist;
      public $title;

      public function exchangeArray($data)
      {
          $this->id       = ( isset($data['id']) ? $data['id'] : null );
          $this->artist   = ( isset($data['artist']) ? $data['artist'] : null );
          $this->title    = ( isset($data['title']) ? $data['title'] : null );
      }
  // ...

如果我继续为我的领带系列构建一个模块,我的模型看起来像这样:

  // ...
  class Neckties
  {
      public $tieID;
      public $tieColor;
      public $tieDesigner;

      public function exchangeArray($data)
      {
          $this->tieID        = ( isset($data['tieID']) ? $data['tieID'] : null );
          $this->tieColor     = ( isset($data['tieColor']) ? $data['tieColor'] : null );
          $this->tieDesigner  = ( isset($data['tieDesigner']) ? $data['tieDesigner'] : null );
      }
  // ...

对于我的Insect系列,我的模型看起来像这样:

  // ...
  class Insects
  {
      public $bugID;
      public $bugSpecies;
      public $bugLatinName;

      public function exchangeArray($data)
      {
          $this->bugID        = ( isset($data['bugID']) ? $data['bugID'] : null );
          $this->bugSpecies   = ( isset($data['bugSpecies']) ? $data['bugSpecies'] : null );
          $this->bugLatinName = ( isset($data['bugLatinName']) ? $data['bugLatinName'] : null );
      }
  // ...

你可以从这个模式推断我的FancyShoelaces系列,我的BathtubToys系列,我的CommemorativeSpoons系列,我的FoodsThatLookLikePresidents系列等等。

开发这样的模型在两个方面效率很低:1)每次我创建一个模型来从不同的表中绘制数据时,我只是复制相同的代码并更改字段和变量名称; 2)每当我更改或添加表字段时,我都必须返回并修改我的ZF2代码。此外,我总是冒着在标签上出错或完全忽略整个领域的风险。

我正在将CMS迁移到ZF2,在我当前的项目中,我使用一个全局函数,它根据通过参数识别的任何表的字段名声明和填充变量:

  global $query_table_names;
  $query_table_names = "SELECT column_name, column_type, data_type FROM information_schema.columns ";
  $query_table_names .= "WHERE table_name = '$table_name' AND table_schema<>'information_schema'";

  $columns = mysqli_query($mysqli, $query_table_names) or die('Query failed: ' . mysqli_error());
  while ($column = mysqli_fetch_array($columns, MYSQL_ASSOC)) {
    $column_name = $column['column_name'];
    $data_type = $column['data_type'];

    $$column_name = ( isset($data[$column_name]) ? $data[$column_name] : null );

  }

我想在ZF2中创建一个这种方法的传真,但作为一个ZF2新手,我不知道如何正确编写代码或在哪里放置它。如果您有任何建议或指导,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是Data Mapper设计模式的实现。您可以查看Wikipedia了解更多相关信息。

extract方法是数据映射器的一部分,而他的对应方是hydrate

ZF2有许多用于从数据库中保湿对象的类。您可以查看Zend\Stdlib\Hydrator文件夹。

例如,您会找到适用于您的用例的Zend\Stdlib\Hydrator\ObjectProperty

Documentation link