升级到 Yii2,ORM 不起作用

Posted

技术标签:

【中文标题】升级到 Yii2,ORM 不起作用【英文标题】:Upgrading to Yii2, ORM not functional 【发布时间】:2016-01-20 14:32:51 【问题描述】:

我正在将一个大型项目从 Yii1 升级到 Yii2。我遇到了一些关于 ORM 的问题。

我有几个以下列方式声明的关系(基本上是来自guidebook 的复制粘贴):

class Order extends \yii\db\ActiveRecord 

/* other code */

public function getAffiliate()

    return $this->hasOne(Affiliate::className(), ['id_affiliate' => 'affiliate_id']);

每当我尝试回显或 w/e $order->affiliate->name;我收到以下错误:

yii\base\ErrorException: Trying to get property of non-object

我对 Yii1 没有任何经验。这个项目有点奇怪的是数据库。所有表格都以yii_tablename 开头,ID 为:id_tablename。 Yii1 是否正常,是否会导致上述问题?

编辑:当我像这样执行函数时:$order->getAffilate() 它返回一个 ActiveQuery,没有来自附属公司的数据。

当我执行以下操作时:

$order->getBillingAddress()->one();

我收到一个奇怪的错误:

Getting unknown property: app\models\Order::billing

【问题讨论】:

【参考方案1】:
return $this->hasOne(Affiliate::className(), ['id_affiliate' => 'affiliate_id']);

这意味着当你调用$order->affiliate yii2 会在Affiliate 表中找到id_affiliate 字段当前Orderaffiliate_id 值并选择one 值。

检查您的字段名称是否正确,数据库是否有正确的数据。

当您调用$order->affiliate 时,您将获得Affiliate 对象。但是如果你调用$order->getAffiliate() 你会得到ActiveQuery 对象。

【讨论】:

刚刚添加了返回的activeQuery显示正确数据的信息,谢谢 抱歉,我再次查看了活动查询中的数据,它返回数据,但没有来自附属公司。那是我的愚蠢.. 检查id_affiliate 是否存在于Affiliate 表中。和affiliate_id 中的Order。接下来检查 ids 是否正确。 API 你的代码是对的。 OrderAffiliate 都存在于数据库中。直接来自Order 的所有数据都会毫无问题地显示在页面上。【参考方案2】:

我找到了解决方案。一个我不是很喜欢的,但它可以完成工作。正在阅读此主题:link。

Kartik V

问题显然在于命名关系和模型属性的唯一性。在您的 User 模型中,您有一个名为 role 的属性,还有一个名为 getRole 的关系 getter。

所以我像这样更改了 getter 的名称:

public function getOrderAffiliate()

    return $this->hasOne(Affiliate::className(), ['id_affiliate' => 'affiliate_id']);

这就解决了问题。以前从未遇到过这个问题,但想知道为什么会这样。

【讨论】:

以上是关于升级到 Yii2,ORM 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 301 从原始 url 重定向到 .htaccess 中对 SEO 友好的 url 不起作用,需要其他解决方案

yii2 pdf生成不起作用

yii2 composer.phar 更新不起作用

身份验证在 yii2 中不起作用

Yii2 setDownloadHeaders()不起作用

Yii2 格式化程序语言环境不起作用