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;
}

此致