如何在 PHP 中使用 ORM

Posted

技术标签:

【中文标题】如何在 PHP 中使用 ORM【英文标题】:HOW to use ORM with PHP 【发布时间】:2012-08-23 07:28:12 【问题描述】:

我已经看到十几个主题和问题都在声明在 php 中使用 ORM(30 php best practices for beginners 和 Why use an orm in php)

所以我想知道,如何在 PHP 中使用 ORM。特别是OOPHP。

假设我们有一个类 User 并且我们正在注册一个。 (我正在使用 RedBean)

<?php
class User 
    private $username;
    private $password;

    public function registerUser($username, $password) 
        require $root . "classes/Helper.php";
        $helper = new Helper();
        $salt = sha1($helper->generateSalt());

        $this->username = $username;
        $this->password = sha1($password + $salt);
        $this->salt = $salt;
        $this->store();
    
    private function store() 
        $user = R::dispense(__CLASS__);
        $user->username = $this->username;
        $user->password = $this->password;
    

?>

这行得通。每次用户注册时,我都会存储它。 或者将store() 函数放在__construct() 中会更好吗? 还是有更好的方法来做到这一点? 使用__CLASS__ 有用还是我应该更好地使用'User'

private function load($username)
    $user = R::find(__CLASS__, 'username=?', array($username));
    $this->username = $user->username;
    $this->password = $user->password;
    $this->salt = $user->salt;
    $this->email = $user->email;

现在,如果我想加载一个用户,我可以在我的页面中创建一个新的用户对象并调用load() 来填充所需的用户。 或者我应该直接使用$userbean = R::find('User', 'username=?', array($username));并将其放在$user = new User();中?

我对可以完成几件事的方式感到有些困惑。这实际上是与面向对象的 PHP 一起使用的吗?

[edit:] 那么,我使用 RedBean 和 OOPHP 的方法是这样吗?

【问题讨论】:

【参考方案1】:

这取决于您的 ORM,一般来说,您有一个关于开始使用 ORM 的常见问题解答。 对于 DOCTRINE 2 ORM,您可以阅读this page,对于 PROPEL ORM,您可以阅读 this page,对于 redbean,您可以阅读 that。

对不起,我不知道redbean,但是,对于其他ORM,它可能很有用(我使用Doctrine2),我们可以在那里与OOPHP一起使用。开始安装ORM后,当我们“调用”你数据库中链接的ORM时接收Object,更方便执行SQL请求并对每个请求进行处理...

对于用户不能像 SQL 或数据库一样,因为 ORM 负责优化请求,所以更方便...

【讨论】:

是的,但这不是我的意思。这更像是我不知道放置数据库连接的良好结构。所以关于这个问题:我应该将用户的“加载”部分和用户对象的序列化放在哪里?

以上是关于如何在 PHP 中使用 ORM的主要内容,如果未能解决你的问题,请参考以下文章

php orm 学说如何获取对象及其相关连接

使用 RedBean PHP ORM 时如何确保表被某个列索引?

PHP ORM如何在构造函数中设置id

使用 ORM 时的 PHP 性能和内存

如何将 ORM 添加到 PHP 遗留项目?

使用 Redbean PHP ORM 时,是不是必须在每个脚本中调用 R::freeze()?