PHP универсальный доступ к базе данных - PullRequest
0 голосов
/ 24 января 2012

Я хочу, чтобы мое PHP Zend Application получило доступ к базе данных.

Поскольку задачи бывают только двух типов: получить и установить значение из базы данных, я подумал об упрощении его универсальными методами.

Это может выглядеть следующим образом.

namespace MyModule\Model;
use Zend\Db\Table\AbstractTable;

class MyTable extends AbstractTable
{
    protected $_name = 'tablename';

    public function getRow($selection)
    {
        $output = array();
        foreach($selection as $key => $value)
        {
            $row = $this->fetchRow($key ' = ' . $value);
            if (!$row) throw new Exception("error");
            array_merge($output, $row->toArray());
        }
        return $output;
    }

    public function addRow($values)
    {
        $this->insert($values);
    }

    public function updateRow($selection, $values)
    {
        foreach($selection as $key => $value)
        {
            $this->update($values, $key ' = ' . $value);
        }
    }

    public function deleteRow($selection)
    {
        foreach($selection as $key => $value)
        {
            $this->delete($key ' = ' . $value);
        }
    }
}

Есть ли какие-либо аргументы безопасности или дизайна против этих методов?Я думал о том, чтобы сделать их глобальными для доступа к базе данных, например

 $row = database('mydatabase')->table('mytable')->getRow(array('id'=>'5'));

. Это решение заменит все простые модели баз данных.

1 Ответ

0 голосов
/ 27 января 2012

Я думаю, что приведу простой пример того, как работает Zend_Db, тогда вы сможете продемонстрировать, что вы намереваетесь. Я не уверен, что полностью понимаю.
Модель

// /application/Models/DbTable/MyTable.php
<?php
class Application_Model_DbTable_MyTable extends Zend_Db_Table_Abstract {

    //actual name of database table
    protected $_name = 'My_Table';
    //name of primary key
    protected $_primary = 'id';

}

И контроллер

// /application/controllers/MyController.php
<?php
class Mycontroller extends Zend_Controller_Action {

    public function init() {
}

    public function indexAction() {
        //instantiate DbTable Model and execute FetchAll returns Rowset object
        //call ->toArray() for array to be returned: $model->fetchAll()->toArray();
        $model = new Application_Model_DbTable_MyTable();
        $model->fetchAll();
}

только с этой простой моделью все ваши функции CRUD уже доступны для ваших моделей и контроллеров.
Мы создаем новые методы или переопределяем существующие методы, чтобы обеспечить больший контроль над нашей бизнес-логикой.
Большинству из нас нужны более простые функции CRUD.
Например, у меня есть функция удаления, которая требует проверки для других данных, чтобы быть успешной:

// /application/Models/DbTable/Track.php
 public function deleteTrack($trackId) {

        $trackRowset = $this->find($trackId);
        $trackToGo = $trackRowset->current();

        $usedBy = $trackToGo->findDependentRowset('Application_Model_DbTable_Member');
        if (count($usedBy) == 0) {

            $where = $this->getAdapter()->quoteInto('trackid = ?', $trackId);

            $this->delete($where);
        } else {
            throw new Zend_Exception('Track is still assigned to member(s) and cannot be deleted.'
                . "<br />" . 'Members: ' . count($usedBy));
        }
    }

Надеюсь, это добавляет ясности нашему обсуждению.

...