核心要点
RedBeanPHP 简介
在快速应用开发(RAD)和原型设计方面,有很多工具可以帮助您快速启动项目。从快速入门到微型框架,从Composer之类的构建工具到一键式安装程序,当然还有ORM——有很多方法可以加快开发速度。我们将重点介绍RedBeanPHP,一个与众不同的ORM,非常适合原型设计。
RedBeanPHP 入门
RedBeanPHP是一个ORM(对象关系映射器),但它不仅仅是一个ORM——它可以动态创建和修改底层数据库模式。传统上,您会将ORM用作预先规划的、预先存在的数据库模式的包装器。这对大多数项目来说都没问题,但是当您进行原型设计(或边做边想)时,让它在后台为您完成可以进一步加快速度。
当您使用RedBeanPHP创建对象(或bean)时,只要您将其保存到数据库,模式就会自动调整以适应。即使您尝试保存没有对应表的对象,这也适用!
安装
安装RedBeanPHP最简单的方法是下载一体化软件包。然后,您只需要引入单个文件rb.php
即可。
您也可以通过Composer安装;但是,库的作者不推荐这种方法——请参阅安装页面了解详情。
分发 Bean
使用RedBeanPHP的第一步是“分发”一个bean——它基本上就是一个对象。请注意,在本文的其余部分,我将“bean”和对象互换使用。
分发是通过上层RedBean类“R”的静态方法完成的,该方法将类型作为参数。
例如:
$user = R::dispense('user');
这将创建一个空的user对象,您可以为其分配属性。您还可以通过添加所需数量作为第二个参数来同时分发多个bean:
$users = R::dispense('user', 10);
在这个阶段,数据库中是否存在表来保存它并不重要;只要我们尝试存储它,RedBeanPHP就会处理它。
让我们尝试一下——请注意静态方法store
的使用,该方法用于写入数据库:
$user = R::dispense('user');
在大多数ORM中,如果您尚未创建表来保存用户,则此操作会失败。但是,使用RedBeanPHP,此操作会成功,因为它会为您创建表。如果您在这个阶段查看您的数据库,您应该会看到这样的表:
$users = R::dispense('user', 10);
由于需要,命名约定非常严格;它是您指定的类型的单数、小写表示。
现在让我们看看如何在迭代时模式发生变化。用户记录可能需要一个密码字段——但我们忘记创建了。
如果您这样做:
$user->name = 'Joe Bloggs'; $user->email = 'joe.bloggs@example.com'; $id = R::store($user); print $id;
这次,RedBeanPHP知道如何存储用户,但是数据库表无法容纳新的字段。没关系——它只需添加一个,您的表现在看起来像这样:
<code>user ---- id int(11) UN PK AI name varchar(255) email varchar(255)</code>
(以下内容与原文类似,但进行了语句结构和用词上的调整,并保持了图片位置和格式不变)
字段数据类型
RedBeanPHP会根据您提供的信息尝试猜测字段的数据类型。因此,如果您这样做:
$user->password = 'secret'; R::store($user);
您会发现age字段已创建为tinyint。
如果字段类型稍后不足,RedBeanPHP会动态更改它。如果您现在尝试将3000赋值给age,则该列将更改为int。如果您将名称拼写为“thirty”,它将更改为varchar。将varchar字段设置为超过255个字符,它将变成TEXT字段,依此类推。
查找 Bean
您可以使用load
方法按主键加载特定对象:
<code>user ---- id int(11) UN PK AI name varchar(255) email varchar(255) password varchar(255)</code>
您可以使用batch
方法一次加载多个对象(按主键):
$user->age = 30; R::store($user);
这将返回一个bean数组。
您还可以使用SQL查找bean。find
方法的第二个参数本质上是从WHERE子句开始的SQL,不包括WHERE关键字本身。例如,要查找年龄不到20岁的用户:
$user = R::load('user', 1);
请注意,我们正在绑定参数,因此第三个参数是一个数组。这将返回一个使用其ID作为键的bean数组。
您可以向SQL添加更多子句,例如:
计数
您可以使用count
方法查找记录数:
$users = R::batch('user', array(1, 2, 3));
删除
要删除单个bean,请使用trash
:
$users = R::find('user', 'age < 20');
要删除特定类型的多个bean,请使用trashAll
:
$number_of_users = R::count('user');
要删除特定类型的全部bean,请使用wipe
:
R::trash($user);
或者,要删除所有内容——这在原型设计时可能很有用——您可以使用nuke
:
R::trashAll('user');
关系
与任何ORM一样,也支持对象之间的关系。
一对多关系使用“拥有”相关对象的理念来引用。例如,如果订单只有一个用户,则该用户被称为“拥有”这些订单。通过使用特定的变量名,我们可以像这样建立这种关系:
$user = R::dispense('user');
这里的关键元素是属性ownOrders
。如果您现在检查您的数据库,您应该会发现RedBeanPHP已将字段user_id
添加到order表中,以及相应的外键。
“拥有”订单的用户可以简单地作为属性访问,例如:
$users = R::dispense('user', 10);
为了演示多对多关系,让我们创建一些角色:
$user->name = 'Joe Bloggs'; $user->email = 'joe.bloggs@example.com'; $id = R::store($user); print $id;
角色不仅仅属于单个用户;它们是共享的。因此,要将前两个角色分配给用户,并在这样做时在数据库中建立关系,我们可以这样做:
<code>user ---- id int(11) UN PK AI name varchar(255) email varchar(255)</code>
这次,您应该会发现一个名为role_user
的新表,它将此关系定义为多对多关系。
您可以通过读取属性来获取属于用户的角色:
$user->password = 'secret'; R::store($user);
这会在第一次访问角色时延迟加载它们。
关系还有很多内容,包括使用link
向关系添加属性、按链接过滤、急切加载等等——请查看文档了解详情。
模型
您可以创建模型以对应于bean类型,只需遵循某些命名约定即可。然后,模型使用FUSE连接到bean;也就是说,通过遵循相关的命名约定,它们被融合在一起。
约定很简单;用下划线分隔“Model”和类型,例如Model_Type
。例如,要为用户创建模型,您只需执行以下操作:
<code>user ---- id int(11) UN PK AI name varchar(255) email varchar(255) password varchar(255)</code>
定义模型后,您可以实现许多方法,这些方法将在bean生命周期的不同点被调用。下表说明了CRUD操作与您可以实现的“钩子”之间的映射:
操作 | 钩子方法 |
---|---|
R::store |
$model->update() |
R::store |
$model->after_update() |
R::load |
$model->open() |
R::trash |
$model->delete() |
R::trash |
$model->after_delete() |
R::dispense |
$model->dispense() |
例如,您可以通过实现update()
来添加验证:
$user = R::dispense('user');
您当然也可以创建自己的方法以及自定义GETter。
查询数据库
您可以像这样执行原始SQL查询:
$users = R::dispense('user', 10);
您可以像这样返回一个多维行数组:
$user->name = 'Joe Bloggs'; $user->email = 'joe.bloggs@example.com'; $id = R::store($user); print $id;
此外,您可以使用参数绑定:
<code>user ---- id int(11) UN PK AI name varchar(255) email varchar(255)</code>
您可以像这样获取单个列:
$user->password = 'secret'; R::store($user);
您还可以使用表的两列获取关联数组:
<code>user ---- id int(11) UN PK AI name varchar(255) email varchar(255) password varchar(255)</code>
部署您的应用程序
虽然它可以说是最适合原型设计(或至少是开发)的——但只要您遵循某些步骤,就没有理由不能将RedBeanPHP继续用于生产环境。
RedBeanPHP动态更新模式的机制称为“流式模式”;但是,这并不适合生产环境,并且性能开销相当大。但是,您可以通过“冻结”它来关闭它:
$user->age = 30; R::store($user);
在投入生产环境时,您需要遵循以下几个步骤:
总结
在本文中,我介绍了RedBeanPHP,它是一种方便的方法,可以通过让您无需先构建底层模式即可处理域模型来启动您的开发过程。它是否适合生产环境还有待观察——但对于原型设计和快速迭代,它是一个很棒的小工具。我没有涵盖很多内容,因此请务必查看文档。
RedBeanPHP常见问题解答
RedBeanPHP是一个简单、轻量级的对象关系映射(ORM)工具,它提供了一系列旨在简化数据库交互的功能。它以其“零配置”方法而闻名,这意味着它只需要最少的设置和配置。它会根据您创建的对象自动构建数据库模式,并且在对象更改时可以根据需要调整模式。RedBeanPHP还支持流式模式和冻结模式,使您可以轻松地在开发和生产环境之间切换。它包括内置的树结构,并支持bean罐装和分发,以便轻松存储和检索对象。
与其他ORM工具相比,RedBeanPHP以其简单易用性而脱颖而出。它不需要配置文件、SQL或模型类。这使其成为初学者或项目(其中全功能ORM显得多余)的绝佳选择。但是,它仍然提供强大的功能,例如自动模式修改和树结构,使其足以胜任更复杂的项目。
RedBeanPHP可以通过Composer(一个流行的PHP依赖项管理工具)安装。安装后,您可以通过在脚本中包含RedBeanPHP文件并设置数据库连接来设置RedBeanPHP。RedBeanPHP将根据您的对象自动创建和修改表。
流式模式是RedBeanPHP的一项功能,它允许它在对象更改时自动调整数据库模式。这在开发过程中可以节省大量时间,因为您不必每次更改对象时都手动修改数据库。但是,建议出于性能和安全原因在生产环境中切换到“冻结模式”。
RedBeanPHP支持对象之间的几种关系类型,包括一对一、一对多和多对多。这些关系是通过使用“bean”(表示数据库表中行的简单对象)来处理的。您可以轻松地将bean相互关联以表示对象之间的关系。
是的,RedBeanPHP可以与现有数据库一起使用。但是,请注意,RedBeanPHP的自动模式修改功能可能会更改数据库结构,因此建议在使用RedBeanPHP之前备份数据库。
虽然RedBeanPHP以其简单易用性而闻名,但它还提供强大的功能,使其也适合大型复杂项目。它的自动模式修改、对各种关系类型的支持以及内置的树结构在大型项目中都非常有用。但是,对于非常大型或复杂的项目,更全面的ORM工具可能更合适。
RedBeanPHP包含多项旨在增强安全性的功能。它使用预处理语句来帮助防止SQL注入攻击,并建议在生产环境中使用“冻结模式”以防止意外的模式更改。但是,与任何工具一样,务必遵循安全最佳实践并使RedBeanPHP保持最新状态。
bean罐装是RedBeanPHP的一项功能,它允许您一次存储和检索整个bean(对象)集。这可能是处理大量数据的便捷方法,并且还可以通过减少数据库查询次数来帮助提高性能。
虽然Composer是安装RedBeanPHP的推荐方法,但也可以直接下载并包含RedBeanPHP文件到您的脚本中。但是,使用Composer可以更轻松地管理和更新RedBeanPHP以及项目可能具有的任何其他依赖项。
以上是Redbean简介的详细内容。更多信息请关注PHP中文网其他相关文章!