ФорумПрограммированиеPHP для идиотов → DBAL

DBAL

  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 27 августа 2009 г. 2:23

    Собственно, сабж - у кого как организован уровень абстрации данных? Используете ли ORM'ы? Может собственные решения? Или какие-нибудь интересные источники посоветуйте.

    Сам сейчас остановился на паттерне TableGateway. Есть базовый класс с методами findById, insert, update, delete (которые для большинства таблиц одинаковы, отличаются только наборами полей). Классы-наследники обычно только find (select) методы.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 2:34, спустя 11 минут

    Я использую plain sql и не заморачиваюсь
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 9:43, спустя 7 часов 9 минут 8 секунд

    тоже plain
    все умрут, а я изумруд
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 10:46, спустя 1 час 3 минуты 1 секунду

    я жестко разделяю на модель и ресурс модель.
    за прямую работу с базой отвечает ресурс модель.
    все ресурс модели отнаследованы от какого-то MySQL адаптера
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 10:47, спустя 1 минуту 2 секунды


    я жестко разделяю на модель и ресурс модель.
    за прямую работу с базой отвечает ресурс модель.
    все ресурс модели отнаследованы от какого-то MySQL адаптера
    покажи как это все выглядит у тебя?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 10:47, спустя 34 секунды

    так же использую ОРМ Propel.
    Давно хочу попробовать Doctrine но както руки не доходят…   =(
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 10:53, спустя 5 минут 57 секунд

    NRG, прибл через часик отпишусь, сейчас просто выхожу на работу и нет времени рисовать =)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 10:54, спустя 39 секунд

    =)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:24, спустя 1 час 29 минут 37 секунд

    в аттаче запринтскринена структура модуля.
    каждый из модулей имеет подобную структуру.

    в папке Model лежат модели.
    в папке Model/Mysql4 лежат ресурс модели.

    кусочек файла Tag/Model/Tag.php :
    <?php
    class Mage_Tag_Model_Tag extends Mage_Core_Model_Abstract
    {
    protected function _construct()
    {
    $this->_init('tag/tag');
    }

    public function loadByName($name)
    {
    $this->_getResource()->loadByName($this, $name);
    return $this;
    }

    public function getEntityCollection()
    {
    return Mage::getResourceModel('tag/product_collection');
    }

    public function getCustomerCollection()
    {
    return Mage::getResourceModel('tag/customer_collection');
    }


    кусочек файла Tag/Model/Mysql4/Tag.php :
    <?php
    class Mage_Tag_Model_Mysql4_Tag extends Mage_Core_Model_Mysql4_Abstract
    {
    protected function _construct()
    {
    $this->_init('tag/tag', 'tag_id');
    }

    public function loadByName($model, $name)
    {
    if( $name ) {
    $read = $this->_getWriteAdapter();
    $select = $read->select();
    if (Mage::helper('core/string')->strlen($name) > 255) {
    $name = Mage::helper('core/string')->substr($name, 0, 255);
    }

    $select->from($this->getMainTable())
    ->where('name = ?', $name);
    $data = $read->fetchRow($select);

    $model->setData( ( is_array($data) ) ? $data : array() );
    } else {
    return false;
    }
    }

    public function addSummary($object)
    {
    $select = $this->_getWriteAdapter()->select()
    ->from($this->getTable('summary'))
    ->where('tag_id = ?', (int)$object->getId())
    ->where('store_id = ?', (int)$object->getStoreId())
    ->limit(1);

    $row = $this->_getWriteAdapter()->fetchRow($select);
    if ($row) {
    $object->addData($row);
    }
    return $object;
    }
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:25, спустя 1 минуту 28 секунд

    Ясно, а чем это удобно?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:29, спустя 4 минуты 13 секунд

    четкое распределение обязаностей между классами.
    ресурс модели работают с субд (или любым хранилищем данных).
    модели работают с данными получеными от ресурс модели.

    насчет удобства, то кому как, мне так нравится, мне удобно.
    Спустя 69 сек.
    на самом деле можно было обойтись просто моделью.
    т.е. тут просто добавлена еще одна прослойка =)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:36, спустя 7 минут 6 секунд

    У меня "просто модель" занимается выборкой данных из БД, я даже не задумывался о еще одной прослойке…
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:40, спустя 3 минуты 40 секунд

    насчет удобства, то кому как, мне так нравится, мне удобно.

    =)
    подчеркну, я не считаю это решение идеальным и безупречным.
    я просто поделился тем, как это реализовано у меня
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:42, спустя 2 минуты

    Ясно, интересно, но не понятно зачем… Кстати, MySQL4 почему?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 27 августа 2009 г. 12:53, спустя 10 минут 33 секунды

    Потому что эта ресурс-модель работает с mysql, начиная с версии 4.1

Пожалуйста, авторизуйтесь, чтобы написать комментарий!