Eloquent $appends 属性返回 null
Eloquent $appends attributes returning null
我正在通过附加属性将一些数据加载到 Eloquent 模型中,但返回的模型属性始终为空。我在我的模型中定义了 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 and http://laravel.io/forum/02-26-2014-model-attribute-accessor-not-working-with-object-get-helper-function)
我正在使用今年 2 月发布的最新版本 Laravel 4 (v4.2.17)。从我在文档和其他地方阅读的内容来看,似乎 好像我做的一切都是正确的。任何人都可以看到我没有做的事情或确认这仍然是一个问题吗?
更新
所以我想我已经解决了 75% 的问题。我没有意识到您可以将数组传递给 $model->load() 以使用 where/orWhere/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
});
});
});
});
});
遍历集合时是否存在加载不 'stick' 的某些原因?
如果我错了请纠正我,但附加不会传递 $value,因为它没有映射到 table 列。我一直认为它是某种经过计算的 属性。
鉴于我们有可填充的列 'first' 和 'last',我们可能会创建一个名为 'fullname'.
的附加项
protected $appends = [
'fullname'
];
public function getFullnameAttribute()
{
return $this->attributes['fullname'] = $this->first . ' ' . $this->last;
}
基本上,我认为您感到困惑的是附加是您附加到模型属性的额外数据。您应该 return 来自访问器的值。返回 $value 将为空,因为 $value 不存在,这就是您手动附加它的原因。在访问器中尝试 returning 'foo' 然后你就会明白我的意思了。
您好,如果您想附加一些与另一个模型相关的额外数据,您可以这样做。
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;
}
此致
我正在通过附加属性将一些数据加载到 Eloquent 模型中,但返回的模型属性始终为空。我在我的模型中定义了 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 and http://laravel.io/forum/02-26-2014-model-attribute-accessor-not-working-with-object-get-helper-function)
我正在使用今年 2 月发布的最新版本 Laravel 4 (v4.2.17)。从我在文档和其他地方阅读的内容来看,似乎 好像我做的一切都是正确的。任何人都可以看到我没有做的事情或确认这仍然是一个问题吗?
更新
所以我想我已经解决了 75% 的问题。我没有意识到您可以将数组传递给 $model->load() 以使用 where/orWhere/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
});
});
});
});
});
遍历集合时是否存在加载不 'stick' 的某些原因?
如果我错了请纠正我,但附加不会传递 $value,因为它没有映射到 table 列。我一直认为它是某种经过计算的 属性。
鉴于我们有可填充的列 'first' 和 'last',我们可能会创建一个名为 'fullname'.
的附加项protected $appends = [
'fullname'
];
public function getFullnameAttribute()
{
return $this->attributes['fullname'] = $this->first . ' ' . $this->last;
}
基本上,我认为您感到困惑的是附加是您附加到模型属性的额外数据。您应该 return 来自访问器的值。返回 $value 将为空,因为 $value 不存在,这就是您手动附加它的原因。在访问器中尝试 returning 'foo' 然后你就会明白我的意思了。
您好,如果您想附加一些与另一个模型相关的额外数据,您可以这样做。
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;
}
此致