阻止在使用访问者时自动附加关系

时间:2018-01-23 06:34:08

标签: laravel laravel-5.5

假设我们有Product这样的模型:

class Product extends Model
{
    protected $appends = ['picture'];

    public function getPictureAttribute()
    {
        $picture = NULL;
        if (!$this->images->isEmpty()) {
            $picture = $this->images->where('selected', TRUE)->first()->path;
        }
        return $picture;
    }

    public function images()
    {
        return $this->morphMany(Image::class, 'imageable');
    }
}

另一方面,有Image这样的模型:

class Image extends Model
{
    protected $fillable = ['title', 'path', 'imageable_id', 'imageable_type', 'selected'];

    public function imageable()
    {
        return $this->morphTo();
    }
}

正如您所看到的,每个产品可以包含许多图片。其中一个图片可以选择作为默认设置,现在我想要获取Product,其中包含picture字段,其中包含所选图片的path 。为此,我将picture属性作为访问者附加到Product模型。

但每次我在show控制器方法中调用特定产品时都会这样:

public function show(Product $product)
{
    return $product;
}

结果是这样的(自动包含images属性):

{
    "product_id": 1,
    "code": null,
    "created_at": "2017-12-11 12:21:49",
    "updated_at": "2018-01-23 09:38:38",
    "deleted_at": null,
    "picture": "path 2",
    "images": [
        {
            "id": 9,
            "title": "salam",
            "path": "path 1",
            "imageable_id": 1,
            "imageable_type": "Modules\\Product\\Entities\\Product",
            "selected": 0,
            "created_at": "2018-01-23 09:38:38",
            "updated_at": "2018-01-23 09:38:38"
        },
        {
            "id": 10,
            "title": "in the name of god",
            "path": "path 2",
            "imageable_id": 1,
            "imageable_type": "Modules\\Product\\Entities\\Product",
            "selected": 1,
            "created_at": "2018-01-23 09:38:38",
            "updated_at": "2018-01-23 09:38:38"
        }
    ],
    "title": "Updataed Title"
}

我不知道什么是问题,我该如何解决。

2 个答案:

答案 0 :(得分:2)

您可以使用unset() -

 public function getPictureAttribute()
{
    $picture = NULL;
    if (!$this->images->isEmpty()) {
        $picture = $this->images->where('selected', TRUE)->first()->path;
    }
    unset($this->images);
    return $picture;
}

unset你的key返回之前。

答案 1 :(得分:1)

显示图像关系的原因是因为它是图片属性的一部分,一旦你在图片访问器中检索它。

我认为其中一个更好的做法是使用控制api响应中显示的数据的变换器。 League fractal提供此类功能。变压器的作用是过滤输出;很像外向中间件。变形金刚还提供includes的能力,允许您仅在特别要求时显示特定数据。