7

在使用 Doctrine Classes 时需要自定义查询时,有人可以为我提供几个使用/学习 DQL 与 SQL 的明确(事实支持)理由吗?

我发现如果我不能使用 ORM 的内置关系功能来实现某些事情,我通常会在扩展的 Doctrine 或 DoctrineTable 类中编写自定义方法。在这种方法中,用直接 SQL 编写所需的内容(使用 PDO 和适当的准备好的语句/注入保护等......)。DQL 似乎是一种额外的学习/调试/维护语言,但在最常见的情况下并没有提供足够令人信服的理由。DQL 似乎并不比 SQL 复杂得多,因此值得使用——事实上,我怀疑您是否可以在没有扎实的 SQL 理解的情况下有效地使用 DQL。大多数核心 SQL 语法移植在您将与 PHP 一起使用的最常见的数据库中都相当不错。

我错过/忽略了什么?我确信这是有原因的,但我想听听那些有意大量使用它的人,以及尝试使用纯 ole SQL 的好处。

我不是在寻找支持 ORM 的论据,而是在传统的 LAMP 设置(使用 mysql、postgres 等)中需要做一些超出核心“按关系获取”类型需求之外的事情时的 DQL

4

4 回答 4

3

老实说,我是使用 Doctrine1.2 学习 SQL 的 :) 我什至不知道外键、级联操作、像 group_concat 这样的复杂函数以及许多其他东西。索引搜索也是非常好的和方便的东西,开箱即用。

DQL 更易于编写和理解代码。例如,这个查询:

$query = ..... // some query for Categories
   ->leftJoin("c.Products p")

它将在类别和产品之间进行左连接,您不必在 p.category_id=c.id 上写入。

而且,如果将来您将关系从一对多更改为多对多,则相同的查询将完全没有任何更改即可工作。教义会照顾到这一点。如果您使用 SQL 执行此操作,则必须更改所有查询以包含该中间多 2 多表。

于 2012-07-19T07:30:59.943 回答
2

我发现 DQL 更具可读性和方便性。如果配置正确,连接对象会更容易,查询也会更容易编写。

您的代码将很容易迁移到任何 RDBMS。

最重要的是,DQL 是您的对象模型的对象查询语言,而不是您的关系模式。

于 2012-07-17T21:55:03.147 回答
1

使用 DQL 可以帮助您处理对象。如果插入数据库,您将插入一个对象

$test = new Test();
$test->attr = 'test';
$test->save();

如果从数据库中选择,您将选择一个数组,然后您可以将其填充到您的对象中

public function getTestParam($testParam)
     {
        $q=Doctrine_Query::create()
                ->select('t.test_id , t.attr')
                ->from('Test t ')
            $p = $q->execute();
            return $p;
     }

您可以查看 Doctrine 文档以获取更多详细信息

于 2012-07-18T10:30:28.697 回答
1

Zeljko 的回答非常准确。

使用 DQL 而不是原始 SQL 的最重要原因(在我的书中):Doctrine 将实体与其在数据库中持久化的方式分开,这意味着实体不应该随着底层存储的变化而变化。反过来,这意味着如果您希望对底层存储进行更改(即重命名列、更改关系),您不必触及 DQL,因为在 DQL 中您使用实体属性(这只会发生在根据您当前的映射,在幕后翻译以纠正 SQL)。

于 2013-06-20T15:56:56.483 回答