Yii 2.0 的 afterFind 方法如何在 AR 的 with() 中生效? [ 2.0 版本 ]
由于数据表中保存图片路径为:
/uploads/attach/0221/abcd.png
想实现api接口响应的该字段为:
http://www.abc.cn/uploads/attach/0221/abcd.png
已知可以改写AR类的afterFind
来实现改写;但是很明显这个只能在当前AR的模型::find()
时才生效;并不能在其关联的with(['author'])
中生效
当我要实现查询post时同时关联查询author的信息:
post::find()->with(['author'])->asArray()->all()
由于关联的author
没有经过::find()
而是通过with()
关联查询的,并不能达到预期效果;
如何实现出author
的avatar
字段也响应出完整的url呢?
有什么好的办法和思路呢?
mydzoo 补充于 2019-02-22 14:37
最佳答案
其他 4 个回答
-
return19931112 回答于 2019-02-21 16:45 举报
去掉
asArray
,用对象的形式获取avatar
字段的值,因为 Yii2 底层的\yii\db\ActiveQueryTrait::findWith
方法if ($relation->asArray === null) { // inherit asArray from primary query $relation->asArray($this->asArray); }
all
方法最后会调用\yii\db\ActiveQuery::populate
if (!$this->asArray) { foreach ($models as $model) { $model->afterFind(); } }
所以会出现你遇到的情况。综上所述,直接用对象访问就可以解决
共 4 条回复return19931112 回复于 2019-02-22 10:41 回复那可以用楼下的方法重写fields
@return19931112 看了下文档,应该用重写fileds方法更合适,但是依然在with()中无法生效;截图已经补充
return19931112 回复于 2019-02-22 15:32 回复@mydzoo 你把asArray()去掉试试
-
-
-
mydzoo
注册时间:2017-01-05
最后登录:2022-03-29
在线时长:53小时40分
最后登录:2022-03-29
在线时长:53小时40分
- 粉丝4
- 金钱2075
- 威望10
- 积分2705