Seeding Movies with One to Many Model Factory Relationships
In this lesson, we'll learn how we can use Model Factory Relationships to create a pool of cineasts to bind to our movies. This will create cineasts bound to many movies as a writer, director, or both.
- Author
- Tom Gobich
- Published
- Mar 22
- Duration
- 5m 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
Seeding Movies with One to Many Model Factory Relationships
-
[MUSIC]
-
Within our start cedar, we're already defining the specific roles and
-
movie statuses that we want to work with.
-
So we don't have factories for either one of those.
-
And as we've already learned in our movie factory, we can use states to specifically
-
define which of those values we want to use for both our movie statuses.
-
And we can do the same for our rules whenever it comes time to it.
-
So our relationship for our user roles and movie and
-
movie statuses can use states to define what those values should be.
-
However, whenever it comes to our movie and its sinist for writer and director,
-
we will want to specify the relationship inside of our factory for those.
-
So underneath our states here, let's go ahead and
-
do dot relation just as we did with our user and profile.
-
And once we hit our strings,
-
we'll get our intellisense with our options here as defined on our model.
-
Again, we're gonna wanna skip over status and we can do director here.
-
I'm gonna call back function that returns back the factory that should be used for
-
our director, which will be our sinist factory.
-
And for Lucid to set this relationship, it's going to use the configuration that
-
we've defined on our model for the specific relationship
-
to discern what column gets the value whenever it's creating the fake values.
-
So whenever we create a movie factory with a director,
-
it will use our director relationship as we've defined it on the model to discern
-
that the sinist factory's ID should be set on the director ID for our movie factory.
-
Meaning that if we scroll up here, we can get rid of our director and
-
writer ID and instead just rely on the relationship to set those.
-
And we're going to want to copy that, paste it in, and
-
do the same thing for our writer.
-
Then we can jump over to our sinist factory and
-
apply the inverse side there as well.
-
So relation, and we have movies directed,
-
provide a callback that returns back our movie factory.
-
And a relation for movies written,
-
that provides back our movie factory there as well.
-
Now we need to actually provide in the fake information for both of these.
-
So just as we're doing here with our profile,
-
if we scroll down to where we're creating our movies,
-
let's start with the simplistic ones here.
-
We can add on to these create mini calls a with director and
-
with writer to create a sinist for both our director and
-
writer for each one of the three movies that will be generated with this call here.
-
So let's go ahead and give that a copy and a paste, paste there and a paste there.
-
Now, alternatively, what we could do is where we're tapping into these actual
-
movies that we're creating using our movie data is if we scroll up to where we're
-
creating our sinists, we have 10 being created here.
-
We can plop those into a variable, so const sinist equals and
-
provide them into our create movies call.
-
And for our create movies, we'll want this to be accepted in as sinists with a type
-
of our sinist model and designate that as an array.
-
Now we can scroll down and on the specific movie row that we're tapping into here,
-
we can do row.directorId equals, and
-
we can reach into our already created sinist array.
-
So sinist there, and reach for a random index inside of this array
-
to randomly assign a director from our already created pool of sinists up here.
-
So that we're not just randomly creating a bunch of directors and
-
writers per each of our movies being generated, but
-
instead we have single sinist records bound to multiple movies as a director or
-
writer.
-
So let's do math.floor here and then math.random, and
-
let's multiply that random call by our sinist.length
-
to get back a random sinist out of the 10 that we've created here.
-
And then we just want to grab that sinist's ID.
-
Now, we're going to get a red squiggly because the object is possibly undefined.
-
We know that we're working with an already created array, and
-
we're just grabbing a random index inside of that array.
-
So we can assert that and
-
get rid of the undefined possibility using an exclamation point there.
-
We'll copy this, paste it in, and
-
let's do the exact same thing for our writer ID as well.
-
Awesome, so whenever we actually run this, we'll have sinists that have been
-
a director or writer of multiple movies.
-
In addition to those just written and directing one single movie.
-
So let's hide our text editor back away, open back up our terminal, and
-
node.ace.migration.refresh-seed to get that applied inside of our database.
-
Let's go ahead and clear that out, and
-
let's jump into our REPL session real quick to verify everything.
-
Await, load models, let's do const movie equals await models,
-
movie, find or fail a movie with an ID of one,
-
movie.serialize to see what we got, 310 the Yuma, okay.
-
Let's await movie load their director, and let's await movie load their writer.
-
So now we can do movie director, serialize that so
-
that we just get back the data as well.
-
And there's Clark Stroson with an ID of eight,
-
which matches our director ID on our movie, awesome.
-
Let's do the same thing with the writer.
-
So movie writer serialize there as well.
-
And there's Diego with an ID of four, which matches our movie's writer ID.
-
Awesome, let's take a look at Clark on the inverse side.
-
So let's do const Clark equals await models,
-
sinist, find or fail, and he has an ID of eight.
-
So we'll find or fail an ID of eight, enter there.
-
We'll do Clark.serialize, and we should see Clark Stroson there, which we do.
-
Let's see, Clark was our director.
-
So we will await Clark.load movies directed, and
-
then we should be able to do Clark.movies directed.
-
If we can already see from the preview that we're gonna get back an array of
-
movies, let's map over those, movie.serialize,
-
so we just get back the data objects.
-
Enter there, and there we go.
-
We get back a number of different movies that Clark has directed.
-
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
-
7.0The Flow of Middleware7m 49s
-
7.1Authenticating A Newly Registered User4m 14s
-
7.2Checking For and Populating an Authenticated User2m 10s
-
7.3Logging Out An Authenticated User2m 24s
-
7.4Logging In An Existing User6m 54s
-
7.5Remembering A User's Authenticated Session6m 55s
-
7.6Protecting Routes with Auth, Guest, and Admin Middleware5m 36s
-
-
Filtering and Paginating Queries
-
8.0Creating A Movie List Page3m 43s
-
8.1Filtering A Query By Pattern Likeness7m 9s
-
8.2Filtering Our List by Movie Status5m 47s
-
8.3How To Apply A Dynamic Sort Filter To Your Query7m 12s
-
8.4Joining SQL Tables To Order By A Related Column4m 49s
-
Validating Query String Filter Values7m 23s
-
How To Paginate Filtered Query Results9m 15s
-
Pagination First, Last, Next, and Previous Buttons4m 2s
-
-
User Watchlist
-
An Alternative Approach to Many-To-Many Relationships4m 56s
-
Toggling A Movie in an Authenticated User's Watchlist9m 56s
-
Listing and Filtering User Watchlist Items7m 34s
-
Allowing Users To Toggle A Movie As Watched4m 44s
-
Filtering By User's Watched Status6m 7s
-
Defining A Composite Unique Constraint4m 46s
-
Join The Discussion! (0 Comments)
Please sign in or sign up for free to join in on the dicussion.
Be the first to Comment!