首页 > 解决方案 > Laravel eloquent 获取相关模型为 column_name => value

问题描述

我有一个与图像表相关的产品表,一对多的关系。

如何获取图像记录而不是数组?相反,只返回 1 条图像记录作为 column_name: value

这段代码:

$products = $request->user()->products()->orderBy('id', 'desc')->with(['images' => function($query) {
            $query->where('featured', 1)->limit(1);
        }])->get();

正在返回这样的数据:

{
        "id": 13,
        "name": "Shoes",
        "price": "3.00",
        "stock": 5,
        "pivot": {
            "user_id": 7,
            "product_id": 13
        },
        "images": [
            {
                "id": 5,
                "file": "5da9d9b493403.png",
                "featured" 1,
                "pivot": {
                    "product_id": 13,
                    "image_id": 5
                }
            }
        ]
    }
}

如何让它像这样返回?

{
        "id": 13,
        "name": "Shoes",
        "price": "3.00",
        "stock": 5,
        "pivot": {
            "user_id": 7,
            "product_id": 13
        },
        "images": "5da9d9b493403.png"
    }
}

标签: laraveleloquent

解决方案


您可以附加一个自定义访问器,从关系中获取第一个图像

Product 模型中

protected $appends = ['images'];

public function getImagesAttribute()
{
    return $this->images()->where('featured', 1)->first()->file;
}

public function images()
{
    return $this->hasMany('App\Image');
}

然后只返回查询而不预先加载

$products = $request->user()->products()->orderBy('id', 'desc')->get();

希望这可以帮助


推荐阅读