2019-07-10 14:05:48 3245次浏览 2条回答 2 悬赏 200 金钱
//POST模型
public function fields()
{
    return [
        'id', 'title', 'content', 'views_count', 'comments_count', 'favorites_count'
    ];
}

public function extraFields()
{
    return [
        'creator' => function ($model) {
            return [
                'id' => $model->creator->id,
                'username' => $model->creator->username,
                'avatar' => $model->creator->getFullAvatar()
            ];
        },
        'forum' => function ($model) {
            return [
                'id' => $model->forum->id,
                'name' => $model->forum->name
            ];
        },
        'comments' => function ($model) {
            return [
                //一对多如何返回指定的字段,
            ];
        },
    ];
}

//POST控制器
public function actionView($id)
{
    $model = Post::find()->where(['id' => $id])->one();


    $data = $model->toArray([], ['creator', 'forum', 'comments']);
    return $data;
}

因为要做 API,需要在访问 url 的时候就输出数据和其关联的相关数据:

尝试一对一 hasOne 可以指定输出关联模型的指定字段,这个没什么问题。
但是一对多 hasMany 的情况下如何去输出指定字段的数据呢?需要在 return 里面 foreach 吗?

我想关联输出 comments 的 'title','content','user_id' 字段,以及其 comments.creator'id', 'username', 'avatar' 数据

最佳答案

  • drodata 发布于 2019-07-11 09:47 举报

    ActiveRecord fields() 和 extraFields() 内能直接使用关系名称。以你的例子为例,'creator', 'forum' 和 'comments' 都是 Post 的关系名称,可以像表格列名(attribute)那样直接使用:

    // Post Model
    public function fields()
    {
        return [
            'title',
            'content',
            ...,
            'creator' => function ($model) {
                return [
                    'id' => $model->creator->id,
                    'username' => $model->creator->username,
                    'avatar' => $model->creator->getFullAvatar()
                ];
            },
            'forum' => function ($model) {
                return [
                    'id' => $model->forum->id,
                    'name' => $model->forum->name
                ];
            },
    
            // 直接返回关系名称
            'comments'
        ];
    }
    

    然后在 Comment 模型的 fields() 内进一步指定所需的 fields:

    // Comment Model
    public function fields()
    {
        return [
            'title',
            'content',
            'creator' => function ($model) {
                return [
                    'id' => $model->creator->id,
                    'username' => $model->creator->username,
                    'avatar' => $model->creator->getFullAvatar()
                ];
            },
        ];
    }
    

    通过 posts/1 就能获取所有所需的信息。

    1 条回复
    回复于 2019-07-11 14:10 回复

    经过尝试,这样的写法是正确的。也找到问题所在:因为我在基类model写了hasOne和hasMany关联关系。在API的model里面继承之后,在Api的model里面写fields和extraFields方法,由于命名空间的问题导致无法关联出想要的信息。

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

mydzoo

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

热门问题