gpt4 book ai didi

php - 幕后 : How does an ORM "think"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:13 31 4
gpt4 key购买 nike

我对 Rails ActiveRecord、Doctrine for PHP(以及类似的 ORM)背后的一些设计很感兴趣。

  • ORM 如何设法实现链式访问器等功能,它们通常需要多深的工作?
  • ORM 如何在内部构造查询?
  • ORM 如何管理查询,同时保持所有期望的任意性?

显然这是一个学术问题,但欢迎各种性质的答案!

(我选择的语言是 OO PHP5.3!)

最佳答案

链式方法调用与 ORM 问题正交,它们在 OOP 中无处不在。可链式方法只是返回对当前对象的引用,允许调用返回值。在 PHP 中

class A {
public function b() {
...
return $this;
}

public function c($param) {
...
return $this;
}
}


$foo = new A();
$foo->b()->c('one');
// chaining is equivilant to
// $foo = $foo->b();
// $foo = $foo->c();

至于如何构造查询,有两种方法。在像 ORM 这样的 ActiveRecord 中,有检查数据库元数据的代码。大多数数据库都有某种 SQL 或类似 SQL 的命令来查看此元数据。 (MySQL的DESCRIBE TABLE,Oracle的USER_TAB_COLUMNS表等)

一些 ORM 让您使用 YAML 等中性语言描述您的数据库表。其他人可能会从您创建对象模型的方式推断出数据库结构(我想说 Django 这样做,但我已经有一段时间没看过它了)。最后还有一种混合方法,其中使用了前两种技术中的任何一种,但提供了一个单独的工具来自动生成 YAML/等。或类文件。

如果已知表的名称和数据类型,则很容易实用地编写返回所有行或满足特定条件的一组特定行的 SQL 查询。

关于你的最后一个问题,

How does an ORM manage the queries while sustaining the arbitrary nature of all that is expected of it?

我认为答案是“不太好”。一旦您超越了一张表、一个对象的隐喻,每个 ORM 都有不同的方法和哲学,即应该如何使用 SQL 查询来建模对象。虽然在抽象中,它就像添加基于 ORM 的假设构造查询的新方法一样简单(即 Zend_Db_Table 的“findManyToManyRowset”方法)

关于php - 幕后 : How does an ORM "think"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159494/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com