2019-02-21 13:50:45 306次浏览 3条回答 0 悬赏 50 金钱

甘肃11选5app www.mq8kk.cn 由于数据表中保存图片路径为: /uploads/attach/0221/abcd.png 想实现api接口响应的该字段为: //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()关联查询的,并不能达到预期效果;

如何实现出authoravatar字段也响应出完整的url呢?

有什么好的办法和思路呢?

补充于 2019-02-22 14:37

1.png
2.png
3.png

亿速云

最佳答案

  • LaravelCode 发布于 2019-02-22 07:54 举报

    试着重写下fileds方看可不

    1 条回复
    回复于 2019-02-22 14:33 回复

    看了下文档,应该用重写fileds方法更合适,但是依然在with()中无法生效;截图已经补充

  • 回答于 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 条回复
    回复于 2019-02-21 19:55 回复

    因为需要响应返回格式为 json,在去掉 asArray 后,并不会再最终的 json 中关联返回 with 中所关联查询的内容

    回复于 2019-02-22 10:41 回复

    那可以用楼下的方法重写fields

    回复于 2019-02-22 14:33 回复

    看了下文档,应该用重写fileds方法更合适,但是依然在with()中无法生效;截图已经补充

    回复于 2019-02-22 15:32 回复

    你把asArray()去掉试试

  • 回答于 2019-02-21 16:50 举报

    SELECT CONCAT('//www.abc.cn',a.avatar)或者使用图片的地方进行url拼接字段值。。。

您需要登录后才可以回答。登录 | 立即注册
mydzoo
经理

mydzoo

注册时间:2017-01-05
最后登录:11小时前
在线时长:37小时47分
  • 粉丝1
  • 金钱1135
  • 威望0
  • 积分1505

热门问题