我有一个Product模型和一个Attribute模型。 ProductAttribute之间的关系是多对多的。在我的Product模型上,我试图创建一个动态访问器。我对Laravel的accessor和mutators功能(如here所示)很熟悉。我遇到的问题是,我不想在每次创建产品属性时都创建访问器。

例如,一种产品可能具有可以这样设置的颜色属性:

/**
 * Get the product's color.
 *
 * @param  string  $value
 * @return string
 */
public function getColorAttribute($value)
{
    foreach ($this->productAttributes as $attribute) {
        if ($attribute->code === 'color') {
            return $attribute->pivot->value;
        }
    }

    return null;
}

然后可以像$product->color这样访问产品的颜色。
如果我要在产品中添加size属性,则需要在Product模型上设置另一个访问器,以便可以像$product->size这样访问它。

有没有一种方法可以设置单个“动态”访问器来处理作为属性访问的所有属性?

是否需要用我自己的Laravel访问器功能覆盖?

最佳答案

是的,您可以将自己的逻辑添加到Eloquent Model类的getAttribute()函数中(在模型中覆盖它),但是我认为这不是一个好习惯。

也许您可以具有以下功能:

public function getProductAttr($name)
{
    foreach ($this->productAttributes as $attribute) {
        if ($attribute->code === $name) {
            return $attribute->pivot->value;
        }
    }

    return null;
}

并这样称呼它:
$model->getProductAttr('color');

关于php - 创建动态的Laravel访问器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47439110/

10-12 05:36