Many-To-Many Model Factory Relationships
In this lesson, we'll learn how we can define and use many-to-many relationships with Model Factories, including how we can define pivot table data when creating our fake records.
- Author
- Tom Gobich
- Published
- Apr 02
- Duration
- 4m 50s
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
Many-To-Many Model Factory Relationships
-
(upbeat music)
-
So to get our many to many relationships defined
-
for our factories,
-
we'll first want to dive into the factories for each.
-
And we just need to define the relationship
-
relatively similar for the other relationship types.
-
Do dot relation.
-
We're gonna have an autocomplete come up
-
that offers us our cast members and crew members
-
many to many relationships.
-
So we'll click on one for that.
-
Do our callback function that returns back the factory
-
for the inverse side of the relationship,
-
which is going to be our Sinist Factory.
-
And Lucid will automatically recognize
-
that this is a many to many
-
and account for the pivot table
-
when creating records for this relationship.
-
Okay, let's do that exact same thing for our crew members.
-
So crew members right there,
-
return back our Sinist Factory, just like so.
-
Okay, cool.
-
So let's jump over to our Sinist Factory
-
and do the exact same thing for the inverse side.
-
So dot relation.
-
Here we have our cast movies and crew movies
-
many to many relationships.
-
So we'll do one here.
-
Return back our Movie Factory.
-
Again, Lucid's going to be able to use the relationship type
-
to discern how it should create records
-
for this relationship as we use our factories.
-
And then dot relation, cast movies to create the inverse.
-
Or this one, so Movie Factory, just like so.
-
Awesome.
-
And that's it.
-
The only other difference
-
is whenever we're actually making use of the factory.
-
So if we jump down to our Fake Cedar,
-
we'll go ahead and start
-
with our straightforward Movie Factory creations.
-
So we have with Director and with Writer,
-
which will create one individual Sinist for each.
-
In addition to that, we can also do with now,
-
either cast members or crew members.
-
So we'll do cast members first here.
-
And this is where the second argument
-
really starts to come into play
-
because we get to find a count
-
for the number of records that we want to create.
-
So maybe we want to say that they had 10 cast members
-
a part of this movie.
-
Then we could do that just like so.
-
Okay, next let's do with our crew members.
-
And it saves that to auto formats.
-
And let's say maybe they had five crew members.
-
So now whenever this Movie Factory runs,
-
it will create a Writer Sinist,
-
a Director Sinist that was hiding up there,
-
10 cast members and five crew members.
-
Now we also have that pivot table data
-
and we can provide a third argument
-
to assign that information.
-
This third argument provides back
-
our factory builder for the relation.
-
So we call this builder,
-
do our callback function and do builder dot.
-
And you'll see here that this looks relatively similar
-
to just a normal factory.
-
So we could chain another relationship off of it
-
if we wanted to,
-
but if we look up a little bit further,
-
we'll see our pivot attributes.
-
And that's where we're gonna find
-
the additional pivot table data
-
for each one of these relationships.
-
So if we call this,
-
we'll see that it can either accept an object for the model
-
or an array of objects for the model.
-
If we provide just an object,
-
whatever we define here for the pivot table data
-
will be applied to all 10 of the cast members
-
that we're creating.
-
If we instead provide an array of objects,
-
we'll need to provide 10 object items,
-
one for each cast member that we're creating.
-
And then the object itself
-
would contain the pivot table data
-
for each one of the individual cast members.
-
So we could do character name, Robert.
-
Let's go ahead and break this down onto a separate line,
-
comma, give that a copy,
-
character name, Joy, Anna,
-
so on and so forth.
-
And we could do that 10 times.
-
I think maybe for this demonstration,
-
we'll cut this back down to just three cast members.
-
And then we can add in the sort order
-
for each of these as well.
-
We'll start that at a zero index.
-
So we'll do zero there,
-
sort order one and sort order two.
-
Give that a save to run our formatting.
-
And there we go.
-
For our crew members,
-
maybe they were all camera operators.
-
So for this builder,
-
we can provide a callback here
-
and do builder.pivotAttributes
-
and provide just a single object
-
to say that their title was camera operator.
-
Okay, so let's go ahead and attempt to run this.
-
So let's jump back into our terminal.
-
Let's stop our server, clear that out.
-
Node, ACE, migration, refresh, hyphen, hyphen, seed
-
to roll back, re-migrate and reseed our database.
-
And there we go.
-
So our fake seeder ran successfully.
-
So we should now have at least three movies
-
with cast and crew members.
-
We jump into pgAdmin.
-
We re-migrated,
-
so we'll want to scroll up to our database here.
-
Right click, refresh it,
-
scroll back down to our cast movies and crew movies tables.
-
Let's right click our crew movies
-
and let's view edit data.
-
And let's just click on all rows for right now
-
because it should be relatively minimal.
-
And we see for our crew movies,
-
everybody is a camera operator.
-
Everybody has a sort order of zero.
-
So nobody was given priority for anything.
-
And we have about five Cineasts per movie ID listed out here
-
for a total of 15,
-
which would match the three movies that we've created.
-
If we jump over to our cast movies, right click that,
-
view edit data, all rows.
-
Here we have nine total records.
-
You'll see down here, our sort order goes 012, 012, 012
-
for the three movies that we have.
-
The IDs for the movies match the same
-
and it created an individual sentence for each one of these.
-
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!