访问Symfony/Doctrine中相关值的问题



我有一个状态表,该表用作参考其他表中的状态示例/标记状态示例:

|  id   |   status   |
|-------|------------|
|  1    | Active     |
|  2    | Disabled   |
|  3    | Admin Only |
|  4    | Archived   |

我试图在用户实体的ISENABLED()函数中使用这些值。

 public function isEnabled() {
    $statusObj = $this->status;
    $statusValue = $statusObj->getStatus();
    if( $statusValue  != "Active" ){
        return false;
    }
    // Simply persisting true works
     return true;
}

使用此功能是当前正在登录,我会收到一个非对象错误。

错误:在非对象上调用成员函数getStatus()

看debug,$状态似乎是一个代理对象,而不是我的状态对象,但似乎找不到任何东西可以从这里指向正确的方向。

user.orm.ym.ym

AppBundleEntityUser:
type: entity
table: user
indexes:
    fk_user_status1_idx:
        columns:
            - status_id
id:
    id:
        type: integer
        nullable: false
        options:
            unsigned: false
            comment: 'user Primary Key'
        id: true
        generator:
            strategy: IDENTITY
fields:
   # ....
manyToOne:
    status:
        targetEntity: Status
        cascade: {  }
        joinColumns:
            status_id:
                referencedColumnName: id
        orphanRemoval: false
manyToMany:
    roles:
        targetEntity: Role
        joinTable:
            name: user_has_role
            joinColumns:
                user_id:
                    referencedColumnName: id
            inverseJoinColumns:
                role_id:
                    referencedColumnName: id
lifecycleCallbacks: {  }

我尝试更改user.orm.ym.yl文件中的 fetch:以具有懒惰和渴望的值,都不更改任何内容。

我试图使这篇文章简洁,所以如果我错过了任何重要的细节,请告诉我。

***更新***

我没有基于多到一的单向相对启动设置映射/反移选项。现在,我删除了" null"生成的值,因此状态与已链接的文档匹配。状态表和实体以任何方式不包括对用户的引用。

在我的IDE中运行调试时,我发现IseNabled()被调用两次... IneNabled()的第一个调用看起来很完美。$ statsobj is ==代理对象,当我调用$ statemobj-> getStatus()时,我会看到它按预期返回" active"。然后,函数返回true,第二次调试器跳回IneNabled()。我的用户对象的第二次运行是null。经过几个小时的架气,我的大脑试图找出为什么IseNabled()运行两次...最终,我最终会出现第一次运行,而第二次运行是在身份验证通过后重定向期间进行的。事实证明,整个问题是,$ this->状态永远不会添加到序列化/毫无疑问的函数中,因此状态属性在UnseralSeals中无效,当呼叫InEnabled验证时,该状态属性失败了。

解决方案与所描述的问题相去甚远,除非有人有任何建议使他人对他人有用的建议,否则我会投票删除。

学说由于懒惰的加载机制而将您的关系包裹在代理中。直接访问$this->status时,您会得到该代理对象。

尝试使用getter:

public function isEnabled() {
    if( $this->getStatus()->getStatus() != "Active" ){
        return false;
    }
    ...
}

看起来有点有趣,但是$this->getStatus()为您提供了状态实体,而额外的getStatus()要求状态实体的字段"状态"。

您尚未发布状态实体代码,但是您可能需要这样更改:

manyToOne:
    status:
        targetEntity: Status
        cascade: {  }
        orphanRemoval: false
          inversedBy: value_in_Status
        joinColumn:
            name: status_id
            referencedColumnName: id

请注意,您有" joincolumns"不是" joincolumn"。

相关内容

  • 没有找到相关文章