不能在 RedBean 中存储盒装模型?

     2023-04-12     260

关键词:

【中文标题】不能在 RedBean 中存储盒装模型?【英文标题】:Can't store boxed model in RedBean? 【发布时间】:2017-01-31 09:54:03 【问题描述】:

如何在 RedBean 中存储从$bean->box() 返回的模型?

例如,下面的代码不起作用(它只是插入一个空行):

class Model_Comment extends RedBean_SimpleModel 
    public $message;


$bean = R::dispense('comment');
$model = $bean->box();
$model->message = "Testing";
R::store($model);

如果我使用$model->unbox()->message = "Testing",它可以工作,但这可能会很快变得烦人......

显然上面的代码只是一个例子,我可以在这里设置message属性$bean,但我希望能够装箱一个bean并将它传递给其他方法。

这是它应该如何工作,还是我在这里遗漏了什么?

【问题讨论】:

【参考方案1】:

事实证明,这是在处理 PHP 的“神奇”getter 和 setter 方法 __get()__set() 时出现的“陷阱”。

查看RedBean_SimpleModel的源代码,它实际上在设置属性时使用了神奇的__set()方法来更新它的bean。

这是陷阱,直接来自PHP documentation:

__set() 在将数据写入不可访问的属性时运行。

__get() 用于从不可访问的属性中读取数据。

__isset() 通过在不可访问的属性上调用 isset() 或 empty() 来触发。

当 unset() 用于不可访问的属性时,会调用 __unset()。

所以事实证明,__set() 永远不会为现有的(可访问的)类成员调用,即public $message。所以我可以从类中删除所有公共字段,这样可以解决问题,但是我会失去所有自动完成功能和 IDE 中的 lint 检查。

所以我想出了这个解决方案:

class MyBaseModel extends RedBeanPHP\SimpleModel 


    public function __construct()
        foreach( get_object_vars($this) as $property => $value )
            if( $property != 'bean' )
                unset($this->$property);
        
    





class Model_Comment extends MyBaseModel 
    public $message;

这在实例化MyBaseModel 时有效地从类MyBaseModel 中删除所有 成员变量,除了 $bean,这当然是RedBeanPHP_SimpleModel 的重要组成部分。

现在我可以轻松地继承 MyBaseModel 并在我的子类模型中拥有我需要的所有公共字段,并且原始问题中的代码可以正常工作。

【讨论】:

使用 Redbean PHP ORM 时,是不是必须在每个脚本中调用 R::freeze()?

】使用RedbeanPHPORM时,是不是必须在每个脚本中调用R::freeze()?【英文标题】:DoyouhavetocallR::freeze()ineveryscriptwhenusingRedbeanPHPORM?使用RedbeanPHPORM时,是否必须在每个脚本中调用R::freeze()?【发布时间】:2012-03-0508:11:09【问题描述】:... 查看详情

从bean拆箱模型时RedBean返回null?

】从bean拆箱模型时RedBean返回null?【英文标题】:RedBeanreturnsnullwhenunboxingmodelfrombean?【发布时间】:2017-01-3104:37:38【问题描述】:我无法让box()方法工作,我只能从中获得NULL。例如,如果我这样做$bean=\\R::load(\'comment\',2);print("\\n\\... 查看详情

在 Redbean 中给出链接 bean 表的名称是不是有规则?

】在Redbean中给出链接bean表的名称是不是有规则?【英文标题】:IstherearuletothenamealinkbeantablegetsgiveninRedbean?在Redbean中给出链接bean表的名称是否有规则?【发布时间】:2015-11-1809:50:45【问题描述】:我有几个由Redbean构建的链接bean... 查看详情

如何克隆存储盒装特征对象的结构?

】如何克隆存储盒装特征对象的结构?【英文标题】:Howtocloneastructstoringaboxedtraitobject?【发布时间】:2015-08-0122:11:04【问题描述】:我编写了一个程序,该程序具有Animal特征和实现该特征的结构Dog。它还有一个结构体AnimalHouse,... 查看详情

不将 php-redbean 的属性保存到数据库

】不将php-redbean的属性保存到数据库【英文标题】:Notsavingpropertyofaphp-redbeantodatabase【发布时间】:2013-07-2522:03:23【问题描述】:我正在使用Redbean作为我的php应用程序的ORM。每个用户(这种情况下的员工)都必须有密码才能登录... 查看详情

说一个类型是“盒装的”是啥意思?

】说一个类型是“盒装的”是啥意思?【英文标题】:Whatdoesitmeantosayatypeis"boxed"?说一个类型是“盒装的”是什么意思?【发布时间】:2010-11-2722:41:57【问题描述】:我听说在某些语言中类型被称为“盒装”。在Java中,我... 查看详情

RedBean 关系定义

】RedBean关系定义【英文标题】:RedBeanrelationdefinitions【发布时间】:2014-03-2009:39:45【问题描述】:我没有关注,我是如何在RedBean中准确定义关系的,不是。我有一个user,它可以有一个父user,它被认为是employer。在另一边,user可... 查看详情

RedBean 数据未同步

】RedBean数据未同步【英文标题】:RedBeanDataNotSynchronized【发布时间】:2012-10-0309:37:31【问题描述】:所以,我一直在尝试在我最近的项目中使用RedBeanPHP,现在我遇到了这个奇怪的问题。我有一个简单的数据结构,省和国家,我... 查看详情

盒装与原始类型作为实体 id

】盒装与原始类型作为实体id【英文标题】:Boxedvsprimitivetypeasentityid【发布时间】:2019-01-0914:20:01【问题描述】:在JPA(Hibernate实现)中,哪种类型更适合用于实体的id:盒装类型(例如Integer)还是未装箱类型(例如int)?朋友... 查看详情

存储模型(上)

...对地址,即首地址为0,其他地址是相对于基地址而编址不能用逻辑地址在内存中 查看详情

在本地存储中保存模型

】在本地存储中保存模型【英文标题】:Savingamodelinlocalstorage【发布时间】:2011-11-2413:29:33【问题描述】:我正在使用带有Backbone的Jerome\'slocalStorage适配器,它非常适合收藏。但是,现在我需要保存一个模型。所以在我的模型中... 查看详情

RedBean ORM ID 列

】RedBeanORMID列【英文标题】:RedBeanORMIDColumn【发布时间】:2015-07-2411:42:22【问题描述】:有没有办法使用RedBeanPHP手动设置新bean的ID?我正在存储来自API的缓存数据,该API生成每一行的ID,为了简单起见,我只想使用该ID。我读过... 查看详情

在codeigniter中调用存储过程

...现错误。以下是错误:错误号:2014命令不同步;你现在不能运行这个命令调用uspTest();文件名:E:\\wa 查看详情

使用 sequelize 在模型/实例中存储和检索 JSON 对象

】使用sequelize在模型/实例中存储和检索JSON对象【英文标题】:UsingsequelizetostoreandretrieveJSONobjectswithinaModel/Instance【发布时间】:2013-12-2409:02:07【问题描述】:我希望在一个大型项目中利用sequelize,并希望可以使用它将JSON对象作... 查看详情

如何在 SelectList 中存储更多模型属性

】如何在SelectList中存储更多模型属性【英文标题】:HowtostoremoremodelpropertiesinSelectList【发布时间】:2015-11-0512:50:24【问题描述】:我有一个包含字段的类ParameterDetails:publiclong?IDget;set;publiclong?ParameterIDget;set;publicstringUnitget;set;publi... 查看详情

如何在 Django 模型中存储电话号码?

】如何在Django模型中存储电话号码?【英文标题】:HowtostoreaphonenumberinDjangomodel?【发布时间】:2020-04-1604:58:11【问题描述】:我想在我的模型中存储用户的电话号码,但不知道以哪种格式存储。存储电话号码的最佳做法是什么?... 查看详情

尝试在 MongoDB 数据模型中存储一些数据时出现问题

】尝试在MongoDB数据模型中存储一些数据时出现问题【英文标题】:IssuewhentryingtostoresomedatainaMongoDBdatamodel【发布时间】:2021-06-3008:23:45【问题描述】:我想在以下MongoDB模型中存储一些数据:importmongoosefrom\'mongoose\';constorderSchema=mon... 查看详情

如何在视图模型中存储 linq 查询结果

】如何在视图模型中存储linq查询结果【英文标题】:Howtostorelinqqueryresultsinviewmodels【发布时间】:2018-10-1919:56:39【问题描述】:我有一个linq查询(在EntityFrameworkCore中),它连接两个sqlserver表,在where子句中过滤结果,然后从结... 查看详情