幕后:ORM 如何“思考”?

2024-01-18

我对 Rails ActiveRecord、PHP Doctrine(以及类似的 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, 甲骨文的USER_TAB_COLUMNS表等)

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

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

至于你的最后一个问题,

ORM 如何管理查询 维持所有人的任意性 那是期望的吗?

我认为答案是“不太好”。一旦超越了单表、单对象的比喻,每个 ORM 都有不同的方法和哲学来说明如何使用 SQL 查询来建模对象。但从抽象的角度来看,它就像添加基于 ORM 假设构造查询的新方法一样简单(即 Zend_Db_Table 的“findManyToManyRowset”方法)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

幕后:ORM 如何“思考”? 的相关文章

  • Cron 作业的远程地址问题

    我需要获取访问者的IP 但是当cron运行时 它发现REMOTE ADDR是一个未定义的索引 事实上 当文件与 cron 一起运行时 没有远程地址 我该如何避免这个问题 PHP 有没有办法说 如果 REMOTE ADDR 存在则考虑它 如果
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • AJAX 安全问题

    我希望能够解决一些关于 AJAX 安全性的问题 这是我试图理解的一个场景 假设我正在使用 AJAX 向页面请求一些半敏感材料 例如 我将把用户的 ID 传递给一个 php 文件 并返回一些关于他们自己的信息 现在 是什么阻止人们模拟此 Ja
  • 计算帖子中使用 WordPress 短代码的次数

    我有以下 WordPress 短代码功能 function wp shortcode static i 1 return i i return return add shortcode shortcode wp shortcode 这很好用
  • Symfony2 实体字段在选项为空时显示所有条目

    我的 Symfony2 项目中有一个实体类型表单字段 builder this gt createFormBuilder projects this gt getProjects builder gt add project entity
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • Php Curl HTTP POST REQUEST 使用嵌套键值对设置自定义标头

    如何使用 Curl 在 php 中设置此标头 CustomInfo 元素是数组 嵌套键值对 AuthenticationInfo 元素是数组 嵌套键值对
  • 载波,Excon::Errors::MovedPermanently in RegistrationsController#update 错误

    我一直在尝试让 Carrierwave 与 amazon s3 一起工作 代替 storage s3 i have storage fog 将其更改为 storage s3 会立即出现错误 https stackoverflow com q
  • 一次用 \r\n & \n & \r 分解字符串? [复制]

    这个问题在这里已经有答案了 我想按行分割字符串 但我希望它基于所有主要使用的换行符 n r n r 并返回一个包含每一行的数组 您可以使用正则表达式和preg split http php net preg split反而 lines pr
  • 如何下载临时文件

    我正在尝试创建一个简短的 PHP 脚本 该脚本采用 JSON 字符串 将其转换为 CSV 格式 使用fputcsv 并使该 CSV 可作为下载的 csv 文件使用 我的想法是使用tmpfile 不用担心 cronjobs 或磁盘空间不足 但
  • ElasticSearch 和 PHP 中的多个字段搜索

    我正在使用最新版本弹性搜索 PHP https github com elasticsearch elasticsearch php以及最新版本的 MongoDB 和 ElasticSearch 我需要对可以包含一个或多个值的多个字段进行搜
  • 验证 LDAPS 连接的自签名证书

    我想从 Linux Linux 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 客户端到 Windows 2012 服务器建立安全的 ldap 连接 ldaps 以更改活动中的用户密
  • 多维数组 PHP 内爆 [重复]

    这个问题在这里已经有答案了 就我的数据结构而言 我有一个 communications 数组 每个 communications id 本身包含三部分信息 id score 和 content 我想内爆这个数组以获得逗号分隔的 id 列表
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • Laravel 5 命名约定

    我对 Laravel 约定有点困惑 因为我是这个框架的新手 我正在关注 Jeffrey Way 他使用的 Laracasts 视频Plural对于控制器名称 E g 页面控制器 卡片控制器 帖子控制器 但如果我参考官方文档Laravel g
  • 致命错误 - 未找到“Mongo”类

    我正在尝试执行此操作 但我收到以下错误 致命错误 在 C wamp www 中找不到类 Mongo Info PHP 5 38 MongoDB mongodb win32 i386 2 0 2 MongoDB PHP 驱动程序 mongo
  • 从 $i 获取值,顺序被打乱

    for i 0 i lt count name i some output ommited td td
  • Rails & Devise:如何在没有布局的情况下呈现登录页面?

    我知道这可能是一个简单的问题 但我仍在试图弄清楚Devise https github com plataformatec devise out 我想要render layout gt false在我的登录页面上 我怎样才能做到这一点Dev
  • RuntimeError:无法修改冻结的数组(Rollbar、Rails 5.1 升级)

    升级到rails 5后无法使用rspec和rollbar 创建 Rails 4 应用程序 升级 gemfile 以使用 Rails 5 尝试添加防滚杆 gem support 标准配置 环境 rb Load the Rails applic
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii

随机推荐

  • 我很好奇 ldc 在 JVM 中的缩写是什么?

    ByteCode ldc将一个单字常量压入操作数栈 ldc 采用单个参数 它是要推送的值 JVM中的大部分字节码都可以通过代码描述得知它们的名称 然而 ldc 我没有看到任何线索 它是负载常数 它将常量池中的一项加载到堆栈上 可用的类型有
  • Xamarin 形式的 iPhone X 中的额外底部和顶部空间

    我使用 XAML 进行 UI 设计 我的应用程序在 Iphone X 设备上运行良好 Iphone X 中唯一的问题是顶部和底部有额外空间 如果我使用下面的代码来启用 Iphone X 安全区域 它会在底部和顶部获得更多空间 On
  • 无法删除 matplotlib polycollection 中的原点

    我尝试了 matplotlib 教程中的 PolyCollection 示例 并注意到一件奇怪的事情 我无法从轴原点删除这个点 见图 我该如何处理这个问题 from mpl toolkits mplot3d import Axes3D fr
  • 如何从原生 php 转换为 codeigniter

    我有以下数据库和PHP 我正在尝试制作类别菜单的无序列表 原来的 php 是自己工作的 我正在尝试将其转换为 Codeigniter 中的 MVC 以下是我到目前为止所得到的结果 但无法正常工作 如果有人能指出我做错了什么 我将不胜感激 D
  • SQL:如何从单个列中选择满足多个条件的单个 id(“行”)

    我有一个非常窄的表 user id ancestry user id 列是不言自明的 祖先列包含用户祖先的国家 地区 一个用户可以在表上拥有多行 因为一个用户可以拥有来自多个国家 地区的祖先 我的问题是 如何选择祖先来自多个指定国家 地区的
  • 在汇编中生成随机数

    我是汇编新手 在生成随机数时遇到问题 我的代码很简单 它在中生成 100 个数字0 25范围并将它们存储在数组中 我遇到的问题是 当我在emu8086汇编程序成功运行并生成 100 个随机数 并将其存储在数组中 但是当我在masm611 每
  • 如何在 C# 中使用 SqlTransaction

    我正在使用以下代码同时执行两个命令 我使用 SqlTransaction 来确保所有命令都得到执行或回滚 当我在没有 事务 的情况下运行程序时 它运行正常 但是当我对他们使用 交易 时 他们显示错误 My code SqlTransacti
  • 如何在 tsconfig.json 中指定多个源文件夹?

    我目前有以下项目结构 project tsconfig json webpack config js package json node modules lots of dependencies typings lots of d ts f
  • 从应用程序洞察中删除跟踪

    我已使用 Application Insights 在 Azure 中部署了我的项目 部署后 我做了一些测试 了解为什么一些跟踪写入各自的 Application Insights 中 但是 我只想要一个新的 没有任何痕迹 Applicat
  • 向事件添加委托 - 线程安全

    可以从多个线程同时执行以下代码 this sequencer Completed OnActivityFinished 从多个线程向事件处理程序添加委托是否是线程安全的 从多个线程中删除事件处理程序的委托是否是线程安全的 使该线程安全的最简
  • 无法在 Spring 3 REST Web 服务中反序列化 START_ARRAY 令牌之外的对象实例

    我正在利用Spring提供的这个很酷的东西 Spring RESTWebService spring的版本是3 如果我从浏览器访问 URL 我可以看到 JSON 响应 但从客户端端点 Android 应用程序 我收到此错误消息 Caused
  • 单括号和双括号 Numpy 数组有什么区别?

    import numpy as np a np random randn 1 2 b np zeros 1 2 print Data type of A type a print Data type of A type b Output D
  • 针对 XSD 的 XML 验证:元素必须没有字符或元素信息项

    为什么我的 XML 无法根据以下 XSD 进行验证 我的 XML 文件是这样的
  • 如何在模块中导入 lib 文件夹

    我有一个 GAE 应用程序 其中包含三个模块和一个 lib 文件夹 当我尝试从 lib 文件夹导入第 3 方库时 GAE 弹出导入错误 我可以通过将 lib 符号链接到 Module 1 lib 和 Module 2 lib 并在每个模块中
  • 使用 axios 从 React 前端启用 CORS?

    我在前端使用 React 并且从我不拥有的另一个域调用 API 我的 axios 请求 axios requestURL method GET headers Access Control Allow Origin Content Type
  • 我的工具栏在 API 级别 19 (Kitkat) 上不显示,而在 API 级别 21 上显示

    我的代码没有在 Kitkat 上显示工具栏 这是我针对两个 Android 版本的屏幕截图 奇巧版本 棒棒糖版本 这背后的原因可能是什么 清单文件
  • Java 7u51不接受带有自签名证书的JNLP?

    我在网上看到Java版本7u51 将于2014年1月发布 将不再接受我自签名的Java Webstart应用程序 真的吗 如果这是真的 我是否有机会为我的 JNLP 申请构建一个解决方法 以便我即使在 2014 年 1 月之后也能够启动该申
  • Ansible concat vars 到字符串

    我花了一天的大部分时间试图解决这个问题 但到目前为止都失败了 我正在构建一些剧本来自动化 Splunk 中的功能 并尝试将清单组中的主机列表转换为 E G search head 1 2 3 4 5 6 7 8 我从该剧的调试输出中获得的预
  • 是否可以在 setup.py 中表达特定于平台的依赖项,而无需构建特定于平台的 Egg 版本?

    我们有一个占位符 Egg 它不包含任何代码 其存在的目的只是为了从 PyPi 存储库中提取依赖包列表 大多数这些依赖包与平台无关 但有些仅在 Win32 平台上使用 是否有可能以某种方式使依赖项成为有条件的平台 以便我的给定依赖项insta
  • 幕后:ORM 如何“思考”?

    我对 Rails ActiveRecord PHP Doctrine 以及类似的 ORM 背后的一些设计感兴趣 ORM 如何设法实现链式访问器等功能以及它们通常期望工作的深度 ORM 如何在内部构造查询 ORM 如何管理查询 同时维持所有预