3 months ago

Caching a specific column in relationship?

Posted 3 months ago by oliverbusk

I have a model called Document, in this I have a method that I use throughout my website to get the full path to the specific document:

public function getDocument($documentName = true)
    $documentName = $documentName ? $this->name : null;

    return storage_path('app/' . $this->getPath() . $documentName);

public function getPath()
    return "{$this->stream->token}/{$this->unique_id}/";

I use it like this (example):

$documentPath = $this->document->getDocument();

However, as you can see, the document path is made up of:


Where $this->stream->token is calling a relationship in my Document model.

public function stream()
    return $this->belongsTo(Stream::class);

Now the method works - I can use the getDocument() to get the full path to the actual file (or just the folder, if I pass in false).

However, this code is fired out multiple places at different times - and because the folder structure is dependant on the stream_token, it makes a query to get the associated stream on each request.


I have tried adding a $with = ['stream'] property to my Document model, so the associated stream is always loaded when fetching the model - but this I don't believe is a good option either, since then all the other queries I have for the document model, that doesn't care about the stream property get's an extra query.

I was wondering - is it possible to cache the token column from the Stream model? Since this column will never change.

Please sign in or create an account to participate in this conversation.