我通过附加属性将一些数据加载到Eloquent模型中,并且返回的模型的属性始终为null。我在模型中定义了protected $appends = array('survey_status);
(名为Survey
),并且访问者定义如下:
public function getSurveyStatusAttribute($value){
return $value;
}
我尝试将属性设置为属性和括号表示法$this->survey_status = ... & $this->attributes['survey_status'] = ..)
,并在返回模型之前尝试使用setAppends()
方法,但都无济于事。
这是在2013年9月底在Laravel论坛上报道的,并在10月份报告固定(见:https://github.com/laravel/framework/issues/2336和http://laravel.io/forum/02-26-2014-model-attribute-accessor-not-working-with-object-get-helper-function)
我正在使用最新版本的Laravel 4(v4.2.17),该版本于今年2月发布。从我在文档和其他地方读到的内容中,似乎就像我正在做的一切一样。可以看到我没有做的事情或确认这仍然是个问题吗?
更新
所以我想我找出了75%的问题。我没有意识到您可以将数组传递给$ model-> load()以使用where /或Where / etc进行复杂查询。所以这个基本的例子有效:
$survey = Survey::find(168);
$survey->load(array('surveyStatus' => function ($q){
$q->where('organization_id', '=', 7485);
}));
return Response::json($survey);
在回复中,我提供了SurveyStatus模型。我现在的问题是我试图迭代一组Survey模型来添加一个SurveyStatus关系,就像上面的工作一样,但响应中没有属性。这就是我用来迭代集合的内容:
$org->surveySets->each(function ($ss) use ($id){
$fye = $ss->fiscal_year_end;
$ss->surveys->each(function ($survey) use ($id, $fye){
$sid = $survey->id;
$survey->load(array('surveyStatus' => function ($q) use($id, $fye){
$q->where('organization_id', '=', $id)->where('fiscal_year_end', '=', $fye);
}));
$survey->content_groups->each(function ($cg) use ($id, $sid, $fye){
$cg->content_rows->each(function ($cr) use ($id, $sid, $fye){
$cr->questions->each(function ($q) use ($id, $sid, $fye){
// do the same thing as surveyStatus but load surveyData relation into question
});
});
});
});
});
在迭代集合时,是否有某些原因加载不会“粘住”?
答案 0 :(得分:1)
如果我错了,请纠正我,但是附加不会传递$ value,因为它没有映射到表列。我一直认为它是各种类型的计算属性。
鉴于我们有可填写的列'first'和'last',我们可能会创建一个名为'fullname'的附加。
protected $appends = [
'fullname'
];
public function getFullnameAttribute()
{
return $this->attributes['fullname'] = $this->first . ' ' . $this->last;
}
基本上我认为令人困惑的是,追加是附加到模型属性的额外数据。您应该从访问者返回一个值。返回$ value将为null,因为$ value不存在,这就是您手动附加它的原因。尝试在你的访问者中返回'foo',然后你会明白我的意思。
答案 1 :(得分:0)
您好,如果您想附加一些与其他模型相关的额外数据,您可以这样做。
protected $appends = [
'catName'
];
// relation
public function category()
{
return $this->hasOne(PostCat::class, 'id', 'id_cat');
}
//getters
public function getCatNameAttribute()
{
return $this->category()->getEager()->first()->name;
}
如果您的相关模型包含许多数据库行,请考虑此
protected $with = [
'category'
];
protected $appends = [
'catName'
];
// relation
public function category()
{
return $this->hasOne(PostCat::class, 'id', 'id_cat');
}
//getters
public function getCatNameAttribute()
{
return $this->category->name;
}
最好的问候