PDO,将PHP对象插入到数据库中

3

我找不到这个问题的答案。

我想将PHP对象保存到MySQL数据库中。例如:

class user{
  private $id, $email, $pw, $first, $last, $group,.....;
 // getters and setters    
}

class someclass{

public function someFunction(){
  $pdo = new PDO(...);
  $objUser = new user();
  $objUser->setEmail(....);
  $objUser->setFirst(....);
  //bla bla bla

 // and I want to save this user object to the DB with something like:
  $pdo->insert($objUser); //in this case db table equals to class name
  //instead of building/writing query manually. 
  //for mysql_query I have made a class for building queries for insert, update and delete 
  //but mysq_query is old and deprecated
}

}

我提出这个请求的主要原因是我不想写一些默认存在的东西。

谢谢。


你可以直接利用PHP内置的serialize/unserialize函数。但是你使用方法不正确。 - Yang
@DavidY,出了什么问题? - Francisco Corrales Morales
2个回答

7
我会在user类中实现插入、更新和删除方法,而不是将其作为数据库类的特性来解释给它的对象。
PHP或mysql PDO类中没有内置的方法来实现这一点,但一些框架实现了ORM(对象关系映射),允许您在对象类中轻松指定它们与数据库的交互方式。(Laravel framework ORM docs
以下是一个非常基本的实现方式。
class ORM {
    public function insert($pdo) {
        // Get object name
        // Get object properties
        // Check if database table exists with object name
        // Generate and run a query to insert a record into that table
        // using the property names and values
    }
    public function update($pdo) {
        // Like insert, but update
    }
    public function delete($pdo) {
        // Etc...
    }
}

class user extends ORM {
    private $id, $email, $pw, $first, $last, $group,.....;
    // getters and setters    
}

class someclass{
    public function someFunction(){
      $pdo = new PDO(...);
      $objUser = new user();
      $objUser->setEmail(....);
      $objUser->setFirst(....);
      //bla bla bla

      $objUser->insert($pdo);
    }
}

哦,是的 :-) 很抱歉,我忘记了。 - Erik Kubica
10
从面向对象编程的角度来看,这样做是没有意义的。从ORM中扩展用户就像从银行中扩展用户一样。用户不是银行的“类型”。遵循dog extends animal的逻辑。然而,你需要一个柜员与用户和银行进行交互。同样,你需要一个数据映射器(Data Mapper)类来获取对象信息并将其存储在数据库中。请进一步了解数据映射器,并尽管设置和映射属性到数据库需要一些工作,但它们具有高度的可重复使用性。 - Tek
1
请使用 DI 而不是扩展 ORM。 - kta

0

你可以使用一个Model类来扩展你的模型类。

使用与MySQL表名相同的属性名称。

在这个类中,你可以创建一个saveToDb($tableName)方法(如果你将它定义为类属性,则可以省略tableName参数),该方法:

  1. 使用查询语句从MySQL表中获取列:

    "DESCRIBE tablename"
    
  2. 从类实例中获取属性:

    get_object_vars($this)
    
  3. 计算1和2的交集(根据您的设置和数据库模型删除1中的id列)。

现在,对于匹配列,您可以插入(或更新)MySQL表。您可以从此动态创建查询(如果您的值具有用户生成的内容,请使用PDO)。

如果您使用扩展模型,仍然可以自由地覆盖某些类中保存之前需要进行一些额外处理的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接