Использование единой функции get для всех моделей - PullRequest
1 голос
/ 19 октября 2011

Итак, у меня есть этот бит кода в расширенной модели (MY_Model) в CodeIgniter:

function get($options = array(), $selects = array(), $joins = array(), $table, $object = TRUE)
{

    if(!empty($options))
    {
        foreach($options as $option => $array)
        {
            foreach($array as $column => $value)
            {
                $this->db->{$option}($column, $value);
            }
        }
    }

    if(!empty($select))
    {
        foreach($selects as $select)
        {
            $this->db->select($select);
        }
    }

    if(!empty($joins))
    {
        foreach($joins as $join => $array)
        {
            foreach($array as $jointable => $column)
            {
                $this->db->join($join, $join.'.'.$column.'='.$jointable.'.'.$column);
            }
        }
    }


    $query = $this->db->get($table);

    return $query->result();

}

Где я могу передать это массивы, как показано ниже:

    $options = array(
        'where' => array(
            'companys.companyID' => $companyID
        )
    );

    $select = array(
        'companyID',
        'companyName'
    );

    $join = array(
        'persons' => array(
            'companys' => 'companyID'
        )
    );

    $result = $this->companyModel->get($options, $select, $join, 'companys');

    print_r('<pre>');
    print_r($result);

Мой вопрос: есть ли причина, по которой это не очень хорошая идея? Я расширил CI_Model по умолчанию в своем собственном MY_Model, и тогда все другие модели могут использовать этот метод get и при этом иметь свои собственные функции. У меня есть аналогичные функции для других основных действий CRUD.

Это другой способ разделения функций в моделях для выполнения большей части работы и обеспечения наименьшего из возможных контроллеров наилучшего маршрута. Даже если это означает, что вы пишете одинаковые куски кода во всех моделях?

Надеюсь, это не глупый вопрос, или я неправильно понял что-то о MVC, но все равно спасибо за ответы.

1 Ответ

0 голосов
/ 19 октября 2011

Добро пожаловать в длинный ряд разработчиков, пытающихся абстрагироваться от sql.;)

Абстракция базы данных является ключевым понятием в веб-приложениях, но никоим образом не является частью шаблона MVC, поскольку модель только описывается как набор данных и методов, которые должны отражать ваш домен.В действительности это часто означает, что для этого есть бизнес-методы и обратные вызовы.Как вы сохраняете ваши данные зависит от вас.Примеры шаблонов, дающие вам некоторое представление о том, что должно быть сделано: здесь .Также взгляните на Doctrine, который использует ActiveRecord в версии 1.x и недавно изменил это в версии 2.0 для гораздо более простого Entity-Pattern с factorys.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...