如何在神奇地创建属性时使用列表?

时间:2015-08-08 17:14:09

标签: laravel eloquent

我有一个充满模特的系列。该模型具有受保护的属性值,该值基本上是基于一些参数的数字。从数据库加载模型时,value属性为null。在第一次尝试访问它(getValueAttribute())时,会设置value属性,因此对于模型的每个单独实例,该数字只是随机的。

现在我想从Collection中获取所有值。 $collection->lists('value','name') ...这将返回如下数组:['NameOfFirstValue' => null, '2ndname' => null]。这看起来很公平......因为lists()显然没有使用我的getValueAttribute()方法。

但是我仍然需要列出的那些,并且似乎无法弄清楚如何。有什么想法吗?

编辑:我没有提到该集合是关系的结果。

添加了我的代码:

我的代码: 问题模型:

class Question extends Model{
... not relevant (?) ...
    public function questionVars()
    {
        return $this->hasMany('\App\QuestionVar');
    }
}

QuestionVar模型:

class QuestionVar extends Model
{

    use SoftDeletes;

    protected $dates = ['deleted_at'];
    protected $value;
    protected $appends = ['value'];

    protected $fillable = [
        'question_id',
        'name',
        'min',
        'max',
        'decimals'
    ];


    /**
     * Returns the value of the QuestionVar when the 'value' property is accesed. Generates if not defined.
     *
     * @return float                Value
     */
    public function getValueAttribute()
    {
        if (!isset($this->value)) {
            $this->value = $this->generate();
        }

        return $this->value;
    }

... relation to Question, and some irrelevant stuff...
}

问题1有两个QuestionVars:苹果和葡萄。

在我执行此操作时的EventServiceProvider中:

public function boot(DispatcherContract $events)
{
    parent::boot($events);

    Question::loaded(function ($question) {
         dump($question->questionVars->first()->value);
        dd($question->questionVars->lists('value','name'));
    });
}

我得到苹果的值,然后是数组[apples => 5,葡萄=>空值]。当我省略第一个值的转储时,我得到[apples => null,grapes =>空值]。

仅供参考:我对于QuestionVar上的属性($ value& $ appends)有点混乱,希望解决一些问题。

在完成所有操作后,问题上的已加载事件将触发。离开它并做到这一点,基本上是相同的:

$question = Question::find(1);
dd($question->questionVars->lists('value','key')

2 个答案:

答案 0 :(得分:0)

从模型中移除protected $value;,它应该有效。

如果您的模型上没有名为getValueAttribute()的属性,则只会调用Laravel的$value魔法。

我建议您阅读Laravel的Model::__get()魔术方法,以便更好地了解它的工作原理。

答案 1 :(得分:0)

我相信你需要删除

protected $value;

getValueAttribute()仅在没有$value变量的情况下才有效,因此您要追加null,因为$value从未设置过。

修改

很抱歉,在发布期间,互联网连接出现了问题。