2019-02-21 13:50:45 3795次浏览 5条回答 1 悬赏 50 金钱

由于数据表中保存图片路径为:
/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()关联查询的,并不能达到预期效果;

如何实现出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('http://www.abc.cn',a.avatar)或者使用图片的地方进行url拼接字段值。。。

  • 回答于 2019-05-05 12:33 举报

    author model 内实现

  • 回答于 2020-04-21 14:30 举报

    完全没必要用什么afterFind

    直接使用ArrayHelper::toArray($model, [get_class($model) => [
    // 这里写映射, 类似于field, 但是比fields要更好
    ]]);

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

mydzoo

注册时间:2017-01-05
最后登录:2022-03-29
在线时长:53小时40分
  • 粉丝4
  • 金钱2075
  • 威望10
  • 积分2705

热门问题