Eloquent $ добавляет атрибуты, возвращающие ноль

Я загружаю некоторые данные в модель Eloquent через добавленный атрибут, и атрибут возвращаемой модели всегда равен нулю. я имею protected $appends = array('survey_status); определено в моей модели Survey) и определите метод доступа следующим образом:

public function getSurveyStatusAttribute($value){
return $value;
}

Я попытался установить атрибут как свойство и в скобках ($this->survey_status = ... & $this->attributes['survey_status'] = ..) а также попытался с помощью setAppends() Метод до возврата модели, все безрезультатно.

Об этом сообщалось на форумах Laravel еще в конце сентября 2013 года и сообщалось, что исправлено в октябре (см .: 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), которая была выпущена в феврале этого года. И из того, что я читал в документах и ​​в других местах это кажется как будто я все делаю правильно. Может ли кто-нибудь увидеть, что я не делаю, или подтвердить, что это все еще проблема?

ОБНОВИТЬ

Так что, думаю, я разобрался с 75% своей проблемы. Я не осознавал, что вы можете передать массив в $ model-> load (), чтобы делать сложные запросы, используя где / или где / и т.д. Итак, этот базовый пример работает:

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

Есть ли какая-то причина, по которой загрузка не «залипает» при переборе по коллекции?

1

Решение

Поправьте меня, если я ошибаюсь, но при добавлении не передается значение $, поскольку оно не отображается в столбце таблицы. Я всегда думал об этом как своего рода вычисляемое свойство.

Учитывая, что у нас есть заполняемые столбцы ‘first’ и ‘last’, мы можем создать приложения под названием ‘fullname’.

protected $appends = [
'fullname'
];

public function getFullnameAttribute()
{
return $this->attributes['fullname'] = $this->first . ' ' . $this->last;
}

По сути, я думаю, что вас сбивает с толку то, что добавления — это дополнительные данные, которые вы добавляете в атрибуты вашей модели. Ожидается, что вы вернете значение из метода доступа. Возвращаемое значение $ будет нулевым, потому что $ значение не существует, поэтому вы добавляете его вручную. Попробуйте вернуть ‘foo’ в свой метод доступа, и вы поймете, что я имею в виду.

1

Другие решения

Здравствуйте, если вы хотите добавить некоторые дополнительные данные, относящиеся к другой модели, вы можете сделать что-то вроде этого.

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

с уважением

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector