升级到 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
字段当前Order
affiliate_id
值并选择one
值。
检查您的字段名称是否正确,数据库是否有正确的数据。
当您调用$order->affiliate
时,您将获得Affiliate
对象。但是如果你调用$order->getAffiliate()
你会得到ActiveQuery
对象。
【讨论】:
刚刚添加了返回的activeQuery显示正确数据的信息,谢谢 抱歉,我再次查看了活动查询中的数据,它返回数据,但没有来自附属公司。那是我的愚蠢.. 检查id_affiliate
是否存在于Affiliate
表中。和affiliate_id
中的Order
。接下来检查 ids 是否正确。 API 你的代码是对的。
Order
和 Affiliate
都存在于数据库中。直接来自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 不起作用,需要其他解决方案