Автор Тема: Класс прослойка доступа к разным таблицам и даже базам данных  (Прочитано 3335 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн code32

  • Участник форума
  • Сообщений: 9
  • Карма: 2
Ситуация такова. Взялись внедрять Zend Framework в уже написанный, но требующий переделки проект. Решили полностью отделить работу с базой данных от кода, отвечающего за представления данных из этой базы. Но, практически все запросы, а их много обращаются сразу к нескольким таблицам и посему как мне кажется Zend_Db_Table_Abstract не подходит, так как он изначально работает только с одной таблицей. Так ли это? Как вообще реализовать объект, который будет обращаться к разным таблицам и порой даже к разным базам данных и при этом не выйти далеко за рамки идеологии Zend Framework?

Оффлайн varan

  • Участник форума
  • Сообщений: 13
  • Карма: 0

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 95
  • zf infected
    • Развитие личности от Александра Махомета
Ситуация такова. Взялись внедрять Zend Framework в уже написанный, но требующий переделки проект. Решили полностью отделить работу с базой данных от кода, отвечающего за представления данных из этой базы. Но, практически все запросы, а их много обращаются сразу к нескольким таблицам и посему как мне кажется Zend_Db_Table_Abstract не подходит, так как он изначально работает только с одной таблицей. Так ли это? Как вообще реализовать объект, который будет обращаться к разным таблицам и порой даже к разным базам данных и при этом не выйти далеко за рамки идеологии Zend Framework?

В целом используя Zend_Db_Table_Abstract вы можете обращаться к разным таблицам, в вызове методов вы можете указывать нужную вам таблицу.

Оффлайн elfin

  • Опытный
  • ***
  • Сообщений: 82
  • Карма: 10
вот пример.
класс унаследован от Zend_Db_Table_Abstract

Цитировать
public function getRightsForGroup($group_id)
   {
      $db = $this->getAdapter();
      $select = $db->select()
               ->from(array('mdl'=>'elf_modules__module'), array('mdl_title'=>'title', 'mdl_id'=>'id', 'w_title'=>'work_title'))
               ->from(array('grp'=>'elf_users__group'), array('grp_id'=>'id','grp_title'=>'title'))
               ->join(array('cl'=>'elf_modules__controllers'),'cl.module_id=mdl.id', array('c_title'=>'work_title','c_id'=>'id'))
               ->join(array('act'=>'elf_modules__actions'), 'act.controller_id=cl.id', array('act_id'=>'id', 'act_title'=>'work_title', 'act_desc'=>'description'))
               ->joinLeft(array('r'=>'elf_users__rights'), 'r.group_id=grp.id AND r.action_id=act.id', array('rid'=>'id', 'action_id', 'group_id'))
               ->where('grp.id=?', $group_id)
               ->order(array('mdl_title', 'c_title', 'act_title'));
      
      //echo $select->__toString();
      $result = $select->query();
      $tmp = $result->fetchAll();
      
      $rightsData = array();
      foreach ($tmp as $k=>$v) {
         
         $rightsData[$v['mdl_id']]['mdl_title'] = $v['mdl_title'];
         $rightsData[$v['mdl_id']]['w_title'] = $v['w_title'];
         $rightsData[$v['mdl_id']]['controllers'][$v['c_id']]['c_title'] = $v['c_title'];
         if ($v['act_id'] == $v['action_id'] && $v['grp_id'] == $v['group_id']) {
            $checked = true;
         } else {
            $checked = false;
         }
         $rightsData[$v['mdl_id']]['controllers'][$v['c_id']]['actions'][$v['act_id']] = array(
               'act_title'=>$v['act_title'], 'act_id'=>$v['act_id'], 'act_desc'=>$v['act_desc'], 'checked'=>$checked);
      }
      unset($tmp);
      return $rightsData;
   }