Eloquent $追加返回null的属性

时间:2015-04-13 17:58:01

标签: php laravel attributes eloquent

我通过附加属性将一些数据加载到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/2336http://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
          });
        });
      });
    });
  });

在迭代集合时,是否有某些原因加载不会“粘住”?

2 个答案:

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

最好的问候