В сравнительно простой системе CRUD-моделей в PHP, куда будут вписываться сложные объединения? - PullRequest
1 голос
/ 11 декабря 2010

Я работаю над редизайном архитектуры в своей работе, и мы в основном остановились на слабо базовом пользовательском решении MVC.Намерение состоит в том, чтобы иметь стандартные операции CRUD плюс дополнительные операции со списком, определенные в каждой из моделей в нашей системе.

К сожалению, около 30% кода в нашей системе использует сложные объединения и другие сложные запросы, которые не соответствуют этой модели.То есть это может соответствовать модели, но функция списка будет огромной и, безусловно, подверженной ошибкам, что мы пытаемся решить с помощью переписывания.

Учитывая, куда бы вы поместили сложный и очень конкретныйзапросы в такой системе?Мы играли с несколькими вариантами.

  1. Добавить несколько версий списка / получить в дополнение к базовым
  2. Добавить в пользовательские модели для этих запросов, которые находятся как братья и сестры, в каталог модели
  3. ДонНе используйте модели в этой ситуации и добавьте работу непосредственно в действие.

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

Где бы вы хотели видеть такие вещи как разработчика?

Ответы [ 4 ]

2 голосов
/ 11 декабря 2010

Мне явно не хватает прав, необходимых для комментирования, поэтому я публикую это как ответ ...

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

0 голосов
/ 01 ноября 2013

Модели - рабочие. Если у вас есть 100 отчетов, вам может понадобиться 100 моделей. Объединения не имеют ничего общего с MVC - то, как обрабатываются ваши данные, - это еще один шаблон. Если вы не используете ORM и не используете активные записи, то все, что осталось, это отправить SQL напрямую на сервер через модель. Возможно, через выделенный класс базы данных, но модель будет обрабатывать запрос и его результаты.

0 голосов
/ 17 декабря 2010

У меня есть похожие проблемы в MVC-фреймворке, который я создавал с нуля.

Мне не особо нравятся издержки SELECT * на сложные запросы, поэтому я не создавал эти функции вчто бы то ни было.

Кодирование медленнее, но я кодирую каждый запрос вручную в соответствующем классе (моя модель вызывает класс в 99% случаев).

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


Пример, предоставляемый в соответствии с запросом:

private function returnFindClientRequests(){

        $query = "SELECT 
        SR.sign_project_name, SR.module_signregister_id_pk
        ,SRI.module_signregister_sign_id_pk,SRI.sign_location_address
        ,SRR.status, SRR.module_signregister_item_client_request_id_pk, SRR.client_comment, SRR.requested_by_user, SRR.date_created
        ,SRR.admin_comment, SRR.date_actioned
        ,CL.client_name, CL.module_client_id_pk

        FROM 
        `module_signregister` SR, `module_signregister_item` SRI, `module_signregister_item_client_request` SRR, `module_client` CL
        WHERE
        SR.module_signregister_id_pk = SRR.module_signregister_id_pk
        AND SRR.module_signregister_sign_id_pk = SRI.module_signregister_sign_id_pk
        AND SRR.requested_by_group = CL.module_client_id_pk
        AND " . Database::groupQuery('CL');

        return $query;

    }

Этот запрос используется несколькимидругие функции, но также использует вызов Database :: groupQuery (), который мы использовали для возврата специфичных для сеанса переменных во многие запросы.

0 голосов
/ 11 декабря 2010

Во-первых, все ваши запросы должны оставаться в вашей модели.Во-вторых, большинство фреймворков mvc предоставляют больше, чем просто простой метод для ваших операций с базой данных, например, функциональность запросов, в которой вы можете передавать строку запроса, в этом случае вы можете создавать свои запросы вручную или с помощью построителя запросов, напримерZend_Db_Table_Select и хорошо обрабатывает несколько соединений.Или, опять же, если мы посмотрим на что-то еще, кроме Zend, скажем, Codeigniter, он все равно предоставляет построитель запросов для модели, в которой вы можете добавлять свои объединения или создавать любые другие сложные запросы.

* 1002похоже, что ваш базовый класс модели (тот, который вы расширяете для каждой из ваших моделей) нуждается в функциональности построителя запросов, тогда у вас должно быть все хорошо, так как вы сможете построить любой запрос внутри любой модели, которая вам нравится.
...