2016-05-12 2 views
0

Я планирую разработать веб-приложение в CakePHP, которое отображает информацию в графических файлах и карты. Я выбрал CakePHP, потому что информация, которую нам нужно показать, очень структурирована, поэтому модельный подход упрощает управление данными; также у меня есть некоторый опыт работы с MVC из ASP.NET, и мне нравится, как просто использовать маршрутизацию.Управление несколькими источниками данных в CakePHP

Итак, моя проблема в том, что несколько организаций, которые могут использовать приложение, будут иметь свою собственную базу данных с другой схемой, которая нам нужна. Я не могу просто установить их строковое соединение в файле app.php, потому что их база данных не будет соответствовать моей модели. Basically what happens is this

И организация DataSource не могла вместить мою модель для многих причин: таблицы не имеют такое же имя, схема отличается, поля моего лица находятся в разнесенных таблицах, может быть, у них есть информацию в разных базах данных или в разных СУБД!

Я хочу знать, если есть способ, чтобы сделать интерфейс, который достигает этого enter image description here

В таким образом, что CakePHP модель/объект может использовать данные, независимо от источника. Есть ли у вас какие-либо предложения о том, как это сделать? Имеет ли CakePHP возможность сделать это возможным? Должен ли я использовать PHP с каким-то языком разметки, например JSON или XML? Может быть, у MySQL есть утилита для преобразования данных из разных источников в представление, и я могу заставить CakePHP использовать представление вместо таблицы? Если у вас есть ответ, вы можете как можно подробнее.

Эти другие варианты возможны, если невозможно сделать интерфейс: - Используйте еще один фреймворк, который может справиться с этим проще и имеет функции, о которых я говорил выше. - Заставьте организацию изменить свою базу данных, чтобы она соответствовала моей модели (мне это не нравится, и, вероятно, они этого не сделают). - Передача данных в собственную базу данных приложения.

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

EDIT: Версия CakePHP 3.2. Важным назначением является то, что ему не нужны все операции CRUD, только «чтение». Надеюсь, что решение станет проще.

+0

Пожалуйста, посмотрите здесь https://github.com/waldemarnt/cake-multi-tenant была построена с использованием CakePHP 2.x, но я думаю, что могло бы помочь вам :) –

+1

Пожалуйста, упомяните точную версию CakePHP, которую вы используете (слой модели/источника данных сильно изменился с помощью CakePHP 3), и пометьте свой вопрос согласованно - спасибо! – ndm

+0

@ndm я добавил информацию, спасибо вам :) –

ответ

1

Не думаю, что на ваш «вопрос» можно ответить правильно, он не содержит достаточной информации, не хватает деталей. Я думаю, есть что-то, которое останется неизменным для всех организаций, но их данные и бизнес-логика будут разными. Но я попробую.

И источник данных организации не может соответствовать моей модели по многим причинам: таблицы не имеют одинакового имени, схема отличается, поля моей сущности находятся в разделенных таблицах, возможно, они имеют информацию в разных базах данных или в разных СУБД!

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

Итак, что вы можете попробовать и что показывает ваше второе изображение, вы реализуете слой, содержащий интерфейсы и базовые классы. Затем создайте плагин Cake для каждой из организаций, которые используют эти интерфейсы и базовые классы, и напишите код, который будет условно использовать плагин в зависимости от того, какие критерии (догадательный домен или поддомен) проверены. Вам необходимо будет определить промежуточные интерфейсы таким образом, чтобы вы могли получить доступ к любой организации одинаково на уровне API.

И одна техническая вещь: вы можете define the connection of a table object в слое модели. Любая организация знает о ее происхождении, но вы не должны внедрять бизнес-логику внутри объекта и не изменять соединение через сущность.

EDIT: версия CakePHP 3.2. Важным назначением является то, что ему не нужны все операции CRUD, только «чтение». Надеюсь, что решение станет проще.

Если это правда или использовать the CRUD plugin (да, вы можете использовать только R часть) или написать код, как класс, который описывает организацию и будет использоваться для создания объектов таблицы и взгляды на летать.

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

1

Я нашел способ без кодирования любого интерфейса. Фактически, он использует некоторые функции, уже включенные в СУБД и CakePHP.

В случае, если схема не соответствует модели, вы можете создавать представления для соответствия именам таблиц и именам столбцов в модели. По определению представления работают как таблица, поэтому CakePHP ищет одно и то же имя таблицы и столбцы, а СУБД выполняет работу. Я сделал тест с представлениями в MySQL, и он отлично работал. Вы также можете комбинировать данные из разных таблиц.

MySQL views

SQL Server views.

Если пользователь использует другой СУБД, вы просто изменить datasource в app.php, и сделать точку, если это необходимо

Если данные распределены в различных СУБД, CakePHP давайте вы установите datasource for each table, вы просто добавить его в app.php и вызвать его в таблице, если это необходимо.

Наконец, если вам просто нужно «чтение», создайте пользователя с ограниченным доступом к представлениям и только с привилегиями SELECT.

ИСПОЛЬЗОВАНИЕ: CakePHP 3.2 SQL SERVER 2016 MySQL5.7

Смежные вопросы