【问题标题】:Yii2 property of objectYii2 对象的属性
【发布时间】:2018-08-10 20:44:04
【问题描述】:

在我的数据库中,我有: 带文件的区域表

 -id
 -name

和花桌

 -id
 -name
 -region - this is ID from ragion table

在我的 Flower 模型中,我有方法

public function getRegion()
    {
        return $this->hasOne(Region::className(), ['id' => 'region']);
    }

现在当我尝试像这样使用它时

$flower->region->name

我收到错误Trying to get property of non-object

$flower->region

返回区域 ID。如何通过使用获取区域名称

$flower->region->name

?

更新: 当我使用 gii 生成 Flower 模型时,我得到了这个方法:

public function getRegion0()
    {
        return $this->hasOne(Region::className(), ['id' => 'region']);
    }

我不明白。为什么我不能使用简单的 getRegion()

【问题讨论】:

  • 理论上,它应该可以工作......我假设你在配置过程中遗漏了一些东西......检查:yiiframework.com/doc/guide/2.0/en/db-active-record
  • 不能同名,应该是花表中的region_id。我不知道如何在 Flower 模型中覆盖 getter 区域
  • 我用gii生成Flower模型,得到getRegion*0*()方法,没搞懂

标签: php activerecord yii2


【解决方案1】:

您不能为关系使用与 DB 属性相同的名称。来自数据库的属性优先于方法(this answer 解释了如何搜索属性的值)。如果您有以region 作为名称的属性,则将使用它来代替方法getRegion() 提供的属性/关系。 Gii 足够聪明,可以用不同的名字生成关系——虽然region0 不是一个好名字,但它可以工作。

在您的情况下,最好的方法是将 region 列重命名为 region_id - 列名称变得更加清晰,并且您可以消除关系名称和属性名称之间的名称冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多