首页 > 解决方案 > 如何通过访问器将其他字段添加到最终 JSON 中?

问题描述

我需要添加一个永远存在的空集合。我做。

protected $appends = ['additional'];

public function getAdditionalAttribute()
{
    return collect();
}

然后我做额外的访问器,例如

public function getSomeAttributeAttribute()
{
    //some code
    return $something; //bool
}

然后在正确的地方我调用这个访问器->append('some_attribute'); 但我需要结果在集合中additional。我试着这样做:

public function getSomeAttributeAttribute()
{
    //some code
    return $this->additional['some_attribute'] = $something; //bool
}

但它不起作用,结果与所有元素处于同一级别,而不是在集合内部additional。我可以做这样的事情:

public function getAdditionalAttribute()
{
    return collect([
        'some_attribute' => $this->some_attribute
    ]);
}

它可以工作,但这个值会一直存在,但我只想在有必要时调用它,->append('some_attribute'); 但集合虽然是空的,但它会一直保持不变。或者也许有不同的方法来制作它。我该怎么做?

标签: phplaraveleloquent

解决方案


也许您更容易覆盖序列化本身:

class YourModel extends Model
{
    /**
     * Convert the object into something JSON serializable.
     *
     * @return array
     */
    #[\ReturnTypeWillChange]
    public function jsonSerialize()
    {
        return [
            'additional' => [
                'some_attribute' => $something
            ]
        ];
    }
}

如果您需要该集合,您可能需要使用自定义集合( php artisan make:collection \\App\\Collections\\AdditionalCollection):

class YourModel extends Model
{
    public function getAdditionalAttribute()
    {
        return new App\Collections\AdditionalCollection($something);
    }
}
class AdditionalCollection extends Collection
{
    private $something;

    public function __construct($something)
    {
        $this->something = $something;

        parent::__construct([]);
    }

    public function __get(string $property)
    {
        if ($property === 'some_attribute') {
            return $this->something;
        }
    }
}

推荐阅读