在使用Doctrine Classes时需要自定义查询时,有人可以提供一些明确(事实支持)的理由来使用/学习DQL与SQL吗?
我发现如果我不能使用ORM的内置关系功能来实现某些东西,我通常会在扩展的Doctrine或DoctrineTable类中编写自定义方法。在这种方法中,直接在SQL中编写所需的内容(使用具有适当预处理语句/注入保护的PDO等)。 DQL似乎是学习/调试/维护的另一种语言,似乎没有提供足够令人信服的理由在最常见的情况下使用。为了保证使用,DQL似乎没有SQL那么复杂 - 事实上我怀疑你可以在没有扎实的SQL理解的情况下有效地使用DQL。大多数核心SQL语法端口都非常适用于您将使用PHP的最常见的数据库。
我缺少/忽视什么?我确信有一个原因,但是我想听听有意使用它的人以及尝试使用普通SQL的好处。
在传统的LAMP设置(使用mysql,postgres等等)中,我不是在寻找支持ORM的论证,而是需要在核心'get-by-relationship'类型需求之外做一些事情。
答案 0 :(得分:3)
老实说,我使用Doctrine1.2学习SQL :)我甚至不知道外键,级联操作,复杂的函数,如group_concat以及许多其他东西。索引搜索也是非常好用且简单易用的东西。
编写和理解代码时,DQL更加简单。例如,此查询:
$query = ..... // some query for Categories
->leftJoin("c.Products p")
它会在类别和产品之间进行左连接,而不必写入p.category_id = c.id。
如果将来你将关系从一对二改变为让多说两多,那么这个相同的查询将完全没有任何变化。学说会照顾到这一点。如果你使用SQL来做,那么必须改变所有的查询以包含那个中间多对多的表。
答案 1 :(得分:2)
我发现DQL更具可读性和便利性。如果您正确配置它,将更容易连接对象,查询将更容易编写。
您的代码很容易迁移到任何RDBMS。
最重要的是,DQL是对象模型的对象查询语言,而不是您的关系模式。
答案 2 :(得分: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文档以获取更多详细信息
答案 3 :(得分:1)
Zeljko的回答很明显。
使用DQL而不是原始SQL的最重要原因(在我的书中):Doctrine将实体与其在数据库中持久化的方式分开,这意味着实体不应该作为底层存储更改而更改。反过来,这意味着如果您希望对底层存储进行更改(即重命名列,更改关系),则不必触及DQL,因为在DQL中您使用实体属性(仅发生在在幕后翻译以纠正SQL,具体取决于您当前的映射。)