Doctrine 在 Active Record 之上添加了什么 - CodeIgniter? [英] What Does Doctrine Add Above Active Record - CodeIgniter?

查看:34
本文介绍了Doctrine 在 Active Record 之上添加了什么 - CodeIgniter?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的很喜欢 CodeIgniter 的 Active Record,它可以很好地支持我所有需要的数据库查询.

I really like CodeIgniter's Active Record and how nicely it allows all my needed database queries.

但我也一直在阅读像 Doctrine 这样的 ORM.当我阅读 Doctrine 的文档时,它似乎不像 Active Record 那样清晰,而且我看不出是什么让它变得更好(如果是的话).

But I've also been reading about ORMs like Doctrine. When I read Doctrine's documentation, it does not seem as clear to use as Active Record, and I can't see what makes it better (if it is).

Doctrine 允许哪些是 Active Record 无法实现的?Doctrine 是否使相同的工作更快、更容易、更好?还是它做了 Active Record 不能做的事情?

What does Doctrine allow that is not possible with Active Record? Does Doctrine make the same job faster, easier, better? Or does it do things Active Record cannot do?

如果人们可以发布任务示例来展示我们正在讨论的内容,那最好.

Best would be if people could post examples of tasks showing what we're talking about.

谢谢,马修

推荐答案

Doctrine 是一个完整的 ORM,它实现了活动记录模式.CodeIgniter 的活动记录类是一个查询构建器/数据库包装器,它基于模式的修改"版本.

Doctrine is a full-fledged ORM that implements the active record pattern. CodeIgniter's active record class is a query builder/database wrapper that is based on a "modified" version of the pattern.

免责声明:我从未使用过 Doctrine.我会根据自己的理解,尽量说明CodeIgniter的主动记录实现和Doctrine的区别.

Disclaimer: I have never used Doctrine. I will try my best to illustrate the differences between CodeIgniter's active record implementation and Doctrine, based on my understanding.

使用 CodeIgniter 的活动记录类,您可以实现这样的模型:

Using CodeIgniter's active record class, you might implement a model like this:

class User_model extends CI_Model
{

    public function get_user_by_username($username)
    {
        // Build query using active record methods
        $this->db->where('username', $username);
        $this->db->where('active', 1);

        // Execute query
        $query = $this->db->get('users');

        // Return results
        return $query->result();
    }

    // ...

}

您基本上是在使用活动记录方法构建查询.很容易看出每个方法(where()get() 等)如何映射到原始 SQL.与仅使用 $this->db->query() 相比,使用活动记录方法的优势在于 CodeIgniter 根据您使用的数据库驱动程序编译每个查询.除此之外,CodeIgniter 的活动记录实现并没有真正做太多.您需要的任何查询,您都需要创建.我希望我已经说明了活动记录方法与查询构建器的相似之处.

You are basically building the query using the active record methods. It's easy to see how each method (where(), get(), etc) maps to raw SQL. The advantage to using the active record methods as opposed to just $this->db->query() is that CodeIgniter compiles each query based on the database driver you are using. Other than that, CodeIgniter's active record implementation doesn't really do much. Any queries you need, you'll need to create. I hope I've illustrated how the active record methods are similar to a query builder.

请注意,以下示例代码可能不正确.使用 Doctrine,您可能会有这样的模型:

Note that that the following sample code may be incorrect. Using Doctrine, you might have a model like this:

/** @Entity */
class User
{

    /** @Column(type="integer") */
    private $id;

    /** @Column(length=50) */
    private $username;

    // ...

}

然后要使用模型和相关的活动记录功能,您可以执行以下操作:

Then to use the model and the associated active record functionality, you would do something like this:

// Instantiate object
$user = new User();

// Set properties
$user->username = 'some_username';

// Save object
$user->save();

// Access properties
echo $user->id;

这只是关于 Doctrine 可以做什么的皮毛.您可以设置属性的默认值或指定表之间的关系.请注意我没有编写任何 SQL 或构建查询.我只是设置了对象的属性,然后保存了它.教义负责其余的工作.

This is just scratching the surface in terms of what Doctrine can do. You can set default values for properties or specify relationships between tables. Notice how I didn't write any SQL or build the query. I just set the properties of the object and then saved it. Doctrine takes care of the rest.

请注意,Doctrine 包含自己的查询构建器,因此它在某种程度上完成了 CodeIgniter 的活动记录所做的工作,等等.

Note that Doctrine includes its own query builder, so in a way it does what CodeIgniter's active record does, and more.

使用 Doctrine 类似于 CakePHP 或 Ruby on Rails 的活动记录模式实现.您可以查看那里以进一步了解该模式.如果您有 CodeIgniter 背景,CakePHP 的示例可能特别容易理解.

Using Doctrine is similar to CakePHP's or Ruby on Rails' implementation of the active record pattern. You could take a look there for additional insight into the pattern. CakePHP's examples might be particularly easy to digest if you're coming from a CodeIgniter background.

为了回答您的其他一些问题,我认为没有什么比 CodeIgniter 主动记录方法更能让 Doctrine 更好的了.它可能更先进,但与任何其他库一样,您想为这项工作选择最好的工具.如果您对 CodeIgniter 的活动记录方法感到满意,并且认为不需要高级 ORM,请跳过它.

To answer some of your other questions, I don't think there's anything that makes Doctrine better than the CodeIgniter active record methods. It may be more advanced, but like any other library, you want to pick the best tool for the job. If you are happy with CodeIgniter's active record methods and you see no need for an advanced ORM, then skip it.

这篇关于Doctrine 在 Active Record 之上添加了什么 - CodeIgniter?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆