非常多才多艺的PHP动态查询

时间:2011-12-09 03:08:13

标签: php database oop abstraction

我试图从一开始就在我的PHP类中抽象尽可能多的逻辑。我将所有数据库表的名称作为我的DBConnection类中的变量。例如,当用户调用$db = new DBConnection();时,它会自动为所有表名创建变量,以便在我到目前为止的所有查询中都有INSERT INTO $db->userTable (fields and constraints)SELECT (fields) FROM $db->forumTable (constraints)之类的内容。但是,如何在一个非常通用的情况下抽象列名称是一个很好的方法,以便我也不难将列名编码到查询中?所以,如果像列名或类似的东西被改变,我不必回去编辑大量的查询?感谢您的任何意见!

2 个答案:

答案 0 :(得分:1)

用某种语言(可能是您自己选择的)编写数据库模型,如果愿意,可以使用域特定语言。使用该模型生成您的MySQL模式以及您希望在PHP中提供的任何中间模型或API。

该模型可以包含“实体”名称(不一定是表perse),属性及其类型(数字,文本,枚举,引用)等内容。

MySQL已经是一个非常技术性的实现,操作起来并不容易。领域特定语言将极大地帮助数据建模和数据一致性,因为您可以免费获得这么多。您没有MySQL提供的所有细节,CHAR,VARCHAR,TEXT,MEDIUMTEXT,LONGTEXT,BLOB。对于非常通用的应用程序,您不想考虑它。

更新:您希望“抽象逻辑”。您应该从抽象数据模型开始。有一个模型可以转换为构建数据库的MySQL查询。您可以使用相同的模型在PHP中生成API。您的模型知道哪些实体(表)以及哪些属性以及哪种类型,以便您可以在PHP中强制执行它们。

答案 1 :(得分:1)

Google Appengine有一种查询语言,它们的query class实现效果很好。也许你可以遵循类似的结构...

语法看起来像这样,

class Song(db.Model):
    title = db.StringProperty()
    composer = db.StringProperty()
    date = db.DateTimeProperty()

query = Song.all()
query.filter('title =', 'Imagine')

参考,AppEngine Query Class