2016-10-11 3 views
2

Есть ли какой-либо возможный способ ленивой загрузки пользовательского атрибута на модели Laravel без, загружая его каждый раз, используя свойство appends? Я ищу что-то похожее, чтобы вы могли lazy load Eloquent relationships.Как ленить загрузить пользовательский атрибут на модели Laravel?

Например, учитывая этот метод сбруя на модели:

public function getFooAttribute(){ 
    return 'bar'; 
} 

Я хотел бы быть в состоянии сделать что-то вроде этого:

$model = MyModel::all(); 
$model->loadAttribute('foo'); 

Этот вопрос является не то же самое как Add a custom attribute to a Laravel/Eloquent model on load?, потому что он хочет загрузить пользовательский атрибут при каждой загрузке модели. Я ищу ленивую нагрузку атрибут только при указании.

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

$model = MyModel::all(); 
$model->foo = $model->foo; 

У кого-нибудь есть лучший способ справиться с этим?

ответ

6

Является ли это для сериализации? Вы можете использовать метод append() на экземпляре модели:

$model = MyModel::all(); 
$model->append('foo'); 

Метод append может также принимать массив в качестве параметра.

+0

Эй, спасибо, это именно то, что я искал! Я рад, что у Laravel есть собственный способ справиться с этим. Я думаю, что они только упоминают «присоединяется» к документам (а не к единственному «append»), поэтому я никогда не слышал об этом. –

+1

Существует много классных методов, о которых я не знал. Погружение в код модели очень поучительно, и я настоятельно рекомендую вам найти отличные инструменты :) – Hammerbot

+0

Это не работает, как описано. Метод 'append()' принадлежит классу 'Model', но когда вы вызываете' MyModel :: all() 'вы возвращаете объект' Collection', который не содержит метод 'append()'. Вам нужно написать: '$ model-> each (function ($ instance) {$ instance-> append ('foo');});' – Soulriser

0

Что-то, как это должно работать ...

public function loadAttribute($name) { 
    $method = sprintf('get%sAttribute', ucwords($name)); 
    $this->attributes[$name] = $this->$method(); 
} 
Смежные вопросы