Eu gostaria de poder adicionar um atributo / propriedade personalizado a um modelo Laravel / Eloquent quando ele for carregado, semelhante a como isso pode ser alcançado com o $model->open()
método do RedBean .
Por exemplo, no momento, no meu controlador, tenho:
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
Seria bom poder omitir o loop e ter o atributo 'disponível' já definido e preenchido.
Tentei usar alguns dos eventos de modelo descritos na documentação para anexar essa propriedade quando o objeto for carregado, mas sem sucesso até o momento.
Notas:
- 'disponível' não é um campo na tabela subjacente.
$sessions
está sendo retornado como um objeto JSON como parte de uma API e, portanto, chamar algo como$session->available()
em um modelo não é uma opção
protected $hidden = []
para adicionar colunas / acessadores que foram excluídos.A última coisa na página de documento do Laravel Eloquent é:
Isso pode ser usado automaticamente para adicionar novos acessadores ao modelo sem nenhum trabalho adicional, como métodos de modificação
::toArray()
.Basta criar
getFooBarAttribute(...)
acessor e adicione ofoo_bar
a$appends
matriz.fonte
toArray
método.Se você renomear seu
getAvailability()
método, ele segetAvailableAttribute()
tornará um acessador e poderá lê-lo->available
diretamente no seu modelo.Documentos: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
EDIT: Como seu atributo é "virtual", ele não é incluído por padrão na representação JSON do seu objeto.
Mas achei o seguinte: Acessadores de modelo personalizado não processados quando -> toJson () chamado?
Para forçar o retorno do seu atributo na matriz, adicione-o como uma chave à matriz $ attribute.
Não testei, mas deve ser bastante trivial para você tentar na sua configuração atual.
fonte
->available
disponível no$session
objeto, mas, conforme$sessions
é convertido diretamente em uma string JSON (faz parte de uma API), não há chance de usar isso.EventSession::all()
retornar um objeto JSON de uma API, você realmente não está usando um modelo Laravel, certo? Desculpe, estou confuso sobre como você implementou seu modelo.class EventSession extends Eloquent
).::all()
é apenas um exemplo.EventSession::find(170071)
seria outro. Eles são chamados em vários pontos do SessionController (SessionController extends \BaseController
), que seriam chamados por URLs como '/ sessions / 170071'.public $available
ao modelo, isso não será mostrado quando o objeto for convertido.protected $appends = array('is_admin');
)Eu tinha algo semelhante: tenho uma imagem de atributo no meu modelo, que contém a localização do arquivo na pasta Armazenamento. A imagem deve ser retornada codificada em base64
fonte
você pode usar a
setAttribute
função no Model para adicionar um atributo customizadofonte
Digamos que você tenha 2 colunas denominadas nome e sobrenome na tabela de usuários e deseja recuperar o nome completo. você pode conseguir com o seguinte código:
agora você pode obter o nome completo como:
fonte
Etapa 1: defina atributos na
$appends
Etapa 2: defina o acessador para esses atributos.
Exemplo:
fonte
No meu modelo de assinatura, preciso saber se a assinatura está em pausa ou não. aqui está como eu fiz isso
depois, no modelo de exibição, eu posso usar
$subscription->is_paused
para obter o resultado.O
getIsPausedAttribute
é o formato para definir um atributo personalizado,e usa
is_paused
para obter ou usar o atributo em sua exibição.fonte
no meu caso, criar uma coluna vazia e definir seu acessador funcionou bem. meu acessador preenchendo a idade do usuário da coluna dob. A função toArray () também funcionou.
fonte