Unmapped and Computed Model Properties
In this lesson, we'll learn how to add unmapped and computed properties to our Lucid Models. We'll discuss the differences between a model column, unmapped property, and a computed property.
- Author
- Tom Gobich
- Published
- Mar 05
- Duration
- 3m 24s
Developer, dog lover, and burrito eater. Currently teaching AdonisJS, a fully featured NodeJS framework, and running Adocasts where I post new lessons weekly. Professionally, I work with JavaScript, .Net C#, and SQL Server.
Adocasts
Burlington, KY
Transcript
Unmapped and Computed Model Properties
-
(upbeat music)
-
So when we were reviewing our database schema,
-
you might've been wondering why we left users as full name
-
and we split that full name into first name and last name
-
for our Cinasts.
-
Well, that was so that we could cover unmapped
-
and computed columns inside of our models.
-
So if we take a look at our Cinasts model,
-
we have our first name and last name as separate columns.
-
But if we take a look at our user,
-
we have just full name here.
-
And we can join our first name and our last name together
-
within our Cinasts model to add in an additional column.
-
So down here at the bottom,
-
we'll define a getter called full name.
-
Scroll up a little bit here.
-
And this will just return back this first name,
-
space, this last name.
-
So let's give this a save
-
and let's jump back into a REPL session to see what we get.
-
So node ace REPL, let's await, load our models
-
and let's await models Cinasts dot query.
-
And let's just get back to first result
-
and let's hit run on that.
-
Okay, so if we scroll up here,
-
we'll see that it was not added to our attributes.
-
It's not a mapped column in any way.
-
And if we scroll up a little bit more,
-
we'll see it's not even on here.
-
It's inside of our getters.
-
So it's not going to come through as a visible column.
-
But if we plop this inside of a variable,
-
so let's do let Cinasts equals
-
and we print out our Cinasts dot full name.
-
Sure enough, we get that Cinasts full name.
-
Their first name is Nathaniel
-
and their last name is Chaplin.
-
Now, the way that we have this defined
-
will allow us to access this
-
so long as it is still a lucid model.
-
The second that we serialize this model,
-
which would include returning it back
-
as a JSON result from our server
-
or passing it into client side code,
-
this column will no longer be included
-
because we haven't specified it to be included.
-
For example, if we do Cinasts dot serialize,
-
to serialize this model,
-
again, this is the same behavior that's going to be used
-
anytime that we return the model result here
-
back as a JSON result from our server
-
or pass it into client side code,
-
we'll get this serialized result here.
-
And you'll see that we get back ID,
-
first name, last name, headshot URL,
-
created at and updated at,
-
but nowhere is our full name.
-
If we wanted our full name to be included
-
with this serialized data,
-
we could jump back into that model
-
and we can decorate this getter with at computed
-
to define this as a computed property.
-
If we scroll up to see where that was imported from,
-
it's from AdonisJS Lucid ORM.
-
So we'll scroll back down here.
-
Don't forget to save
-
and let's hide our text editor back away.
-
And I'm pretty sure we'll need to reload our model here.
-
So let's just double check that.
-
Yeah, sure enough.
-
So let's dot exit, jump back into a REPL session,
-
await, load models, and let's rerun our query.
-
So let's do let Cinasts equal our first one
-
and then let's do Cinasts dot serialize.
-
There we go.
-
So unlike before where we just got back the ID,
-
first name, last name, headshot URL,
-
created at and updated at,
-
we now have in addition to those,
-
a full name being serialized as well.
-
So in turn,
-
if you have a column outside the realms of your database
-
that you wanna return a synchronous result for,
-
you can define it as a getter
-
with whatever name you want it to have on the model
-
for the property
-
and then just return back what you need to return.
-
That can work directly with other properties
-
inside of the model
-
or it could return back something completely unrelated
-
to your other model data.
-
And then if you want it to be included
-
with serialized data for your model,
-
you wanna add computed as a decorator on that property.
-
Introduction
-
Fundamentals
-
2.0Routes and How To Create Them5m 23s
-
2.1Rendering a View for a Route6m 29s
-
2.2Linking Between Routes7m 51s
-
2.3Loading A Movie Using Route Parameters9m 17s
-
2.4Validating Route Parameters6m 6s
-
2.5Vite and Our Assets6m 38s
-
2.6Setting Up Tailwind CSS9m 5s
-
2.7Reading and Supporting Markdown Content4m 32s
-
2.8Listing Movies from their Markdown Files8m 51s
-
2.9Extracting Reusable Code with Services7m 4s
-
2.10Cleaning Up Routes with Controllers4m 52s
-
2.11Defining A Structure for our Movie using Models9m 38s
-
2.12Singleton Services and the Idea of Caching6m 11s
-
2.13Environment Variables and their Validation4m 16s
-
2.14Improved Caching with Redis10m 44s
-
2.15Deleting Items and Flushing our Redis Cache6m 46s
-
2.16Quick Start Apps with Custom Starter Kits6m 28s
-
2.17Easy Imports with NodeJS Subpath Imports8m 40s
-
-
Building Views with EdgeJS
-
3.0EdgeJS Templating Basics8m 49s
-
3.1HTML Attribute and Class Utilities6m 9s
-
3.2Making A Reusable Movie Card Component10m 24s
-
3.3Component Tags, State, and Props4m 53s
-
3.4Use Slots To Make A Button Component6m 56s
-
3.5Extracting A Layout Component5m 13s
-
3.6State vs Share Data Flow2m 59s
-
3.7Share vs Global Data Flow6m 7s
-
3.8Form Basics and CSRF Protection6m 13s
-
3.9HTTP Method Spoofing HTML Forms3m 3s
-
3.10Easy SVG Icons with Edge Iconify7m 57s
-
-
Database and Lucid ORM Basics
-
4.0Configuring Lucid and our Database Connection4m 3s
-
4.1Understanding our Database Schema9m 35s
-
4.2Introducing and Defining Database Migrations18m 35s
-
4.3The Flow of Migrations8m 28s
-
4.4Introducing Lucid Models5m 43s
-
4.5Defining Our Models6m 49s
-
4.6The Basics of CRUD11m 56s
-
4.7Defining Required Data with Seeders11m 11s
-
4.8Stubbing Fake Data with Model Factories13m 48s
-
4.9Querying Our Movies with the Query Builder15m 30s
-
4.10Unmapped and Computed Model Properties3m 24s
-
4.11Altering Tables with Migrations7m 6s
-
4.12Adding A Profile Model, Migration, Factory, and Controller2m 57s
-
4.13SQL Parameters and Injection Protection9m 19s
-
4.14Reusable Query Statements with Model Query Scopes8m 11s
-
4.15Tapping into Model Factory States9m 15s
-
4.16Querying Recently Released and Coming Soon Movies4m 59s
-
4.17Generating A Unique Movie Slug With Model Hooks7m 59s
-
-
Lucid ORM Relationships
-
5.0Defining One to One Relationships Within Lucid Models5m 49s
-
5.1Model Factory Relationships2m 54s
-
5.2Querying Relationships and Eager Vs Lazy Loading5m 17s
-
5.3Cascading and Deleting Model Relationships5m 16s
-
5.4Defining One to Many Relationships with Lucid Models6m 56s
-
5.5Seeding Movies with One to Many Model Factory Relationships5m 24s
-
5.6Listing A Director's Movies with Relationship Existence Queries8m 41s
-
5.7Listing and Counting a Writer's Movies8m 41s
-
5.8Using Eager and Lazy Loading to Load A Movie's Writer and Director5m 18s
-
5.9Defining Many-To-Many Relationships and Pivot Columns9m 48s
-
5.10Many-To-Many Model Factory Relationships4m 50s
-
5.11A Deep Dive Into Relationship CRUD with Models18m 5s
-
5.12How To Create Factory Relationships from a Pool of Data13m 55s
-
5.13How To Query, Sort, and Filter by Pivot Table Data9m 47s
-
-
Working With Forms
-
6.0Accepting Form Data12m 15s
-
6.1Validating Form Data with VineJS9m 29s
-
6.2Displaying Validation Errors and Validating from our Request7m 16s
-
6.3Reusing Old Form Values After A Validation Error2m 3s
-
6.4Creating An EdgeJS Form Input Component5m 28s
-
6.5Creating A Login Form and Validator5m 1s
-
6.6How To Create A Custom VineJS Validation Rule9m 7s
-
-
Authentication & Middleware
-
The Flow of Middleware7m 49s
-
Authenticating A Newly Registered User4m 14s
-
Checking For and Populating an Authenticated User2m 10s
-
Logging Out An Authenticated User2m 24s
-
Logging In An Existing User6m 54s
-
Remembering A User's Authenticated Session6m 55s
-
Protecting Routes with Auth, Guest, and Admin Middleware5m 36s
-
-
Filtering and Paginating Queries
Join The Discussion! (0 Comments)
Please sign in or sign up for free to join in on the dicussion.
Be the first to Comment!