Реализации методов динамического класса PHP OO на основе соединения с базой данных

Я строю систему, которая извлекает данные из разных баз данных (клиентских баз), фильтрует данные и хранит локально. Сохраненные данные будут одинаковыми для всех (клиентов, магазинов, транзакций), но данные, поступающие из разных баз данных, не будут одинаковыми. Мне нужно отфильтровать эти данные на основе их базы данных, например:

У меня есть следующая модель (я использую LaravelPHP): Client — С этой моделью я могу позвонить Client::filterData($data) и это будет работать для конкретного клиента. Я хочу использовать ту же модель и метод для фильтрации моих данных, но с использованием другого интерфейса на основе базы данных клиента.

Это как электронная коммерция с их классами / методами отгрузки. У них есть родительский класс, который простирается от разных типов поставок.

Если это не достаточно ясно, я могу лучше объяснить. Я надеюсь, что вы, ребята, можете помочь мне понять это. Спасибо!

0

Решение

Чтобы ответить на ваш вопрос:

Клиент — с этой моделью я могу вызвать Client :: filterData ($ data), и это
будет работать для конкретного клиента. Я хочу использовать ту же модель и метод
фильтровать мои данные, но с использованием другого интерфейса на основе
клиентская база данных.

Что вы действительно ищете, так это как заменить соединение с базой данных во время выполнения. К сожалению, Laravel не поддерживает Dependency Injection, поэтому вам придется обойти это, чтобы заставить его работать:

abstract class AbstractClient extends Eloquent
{
// move everything from Client class into this one
}

Затем просто расширьте его и определите соединение, которое вы хотите использовать внутри init() метод

class Client extends AbstractClient
{
public funciton init()
{
DB::reconnect('client_database');
}
}

Для другого клиента:

class AnotherClient extends AbstractClient
{
public funciton init()
{
DB::reconnect('another_client_database');
}
}

Таким образом, вы можете настроить одну и ту же модель для разных соединений. Конечно, это нужно улучшить, я оставил это для вас.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]