我有一个充满模特的系列。该模型具有受保护的属性值,该值基本上是基于一些参数的数字。从数据库加载模型时,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')
答案 0 :(得分:0)
从模型中移除protected $value;
,它应该有效。
如果您的模型上没有名为getValueAttribute()
的属性,则只会调用Laravel的$value
魔法。
我建议您阅读Laravel的Model::__get()
魔术方法,以便更好地了解它的工作原理。
答案 1 :(得分:0)
我相信你需要删除
protected $value;
getValueAttribute()
仅在没有$value
变量的情况下才有效,因此您要追加null
,因为$value
从未设置过。
修改强>
很抱歉,在发布期间,互联网连接出现了问题。