【问题标题】:PHP OO Dynamic Class Methods Implementations Based on Database Connection基于数据库连接的 PHP OO 动态类方法实现
【发布时间】:2014-11-06 12:38:48
【问题描述】:

我正在构建一个从不同数据库(客户的数据库)中提取数据、过滤数据并在本地存储的系统。每个人(客户、商店、交易)存储的数据都是相同的,但来自不同数据库的数据不会相同。我需要根据他们的数据库过滤这些数据,例如:

我有以下模型(我正在使用 LaravelPHP):Client - 使用此模型,我可以调用 Client::filterData($data),它适用于特定客户端。我想使用相同的模型和方法来过滤我的数据,但使用基于客户端数据库的不同接口。

这就像电子商务对他们的 Shipment 类/方法所做的那样。它们有一个从不同类型的货物扩展而来的父类。

如果不够清楚,我可以让我的解释更好。我希望你们能帮我解决这个问题。谢谢!

【问题讨论】:

  • 这是一个依赖注入的问题,Laravel 受苦(由于它的一堆静态调用和紧耦合)。
  • 我该如何解决我的问题?
  • 我在这里发现了类似的问题:laravel.io/forum/…
  • 您必须自己编写代码(只需创建一个 abstract 模型并将其扩展用于不同的连接),或者您可以切换到 Zend 或 Symfony,您可以轻松地做到这一点
  • 当初始化事件触发时,你甚至可以在模型中尝试DB::reconnect('another_database');

标签: php class laravel laravel-4 interface


【解决方案1】:

回答你的问题:

Client - 使用这个模型,我可以调用 Client::filterData($data) 并且 将为特定客户工作。我想使用相同的模型和方法 过滤我的数据,但使用基于不同的界面 客户的数据库。

您真正需要的是如何在运行时替换数据库连接。不幸的是,Laravel 不能很好地支持依赖注入,因此您必须解决这个问题才能使其正常工作:

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');
       }
}

这样您就可以为不同的连接设置相同的模型。当然需要改进,我留给你了。

【讨论】:

  • 2 个问题:如何将数据库名称传递给 init 函数?我如何在不同的领域工作?示例:在一个数据库中,我可以拥有(姓名、电子邮件等),在另一个数据库中,客户端可以拥有(名字、姓氏、电子邮件),我需要以不同的方式过滤。
  • 至于第一个问题,这是这里描述的一个非常基本的事情:laravel.com/docs/4.2/database#accessing-connections(重点:您只需在数组中定义连接详细信息,然后通过调用reconnect() 方法读取它。
  • 至于第二个问题,这会有点困难,尤其是当一个表中的字段数量可能不等于另一个表中的字段数量时。但是,这个问题是关于如何使用相同的模型连接到不同的数据库。您的第二个问题是一个单独的主题
  • 数据会有所不同但最终结果必须相同,我的本地数据库将存储相同类型的信息,但数据来自使用不同电子商务的不同数据库,需要过滤方式不同。这是我的主要问题。
猜你喜欢
  • 2018-12-30
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多