Martin Joo Profile picture
Jan 19, 2022 38 tweets 12 min read Read on X
🔥Every #Laravel Eloquent Recipes You’ll Ever Need

I’ve collected my 35 best performing Eloquent-related tweets and put them together in one huge thread. You’ll also find a downloadable PDF below.

🧵Terra-Thread is coming!
1/37
Attribute Cast

In Laravel 8 you can define an accessor in one method with an Attribute cast:
2/37
whereRelation

This example: give every Holding where the Stock relation's ticker column is equal to AAPL:
3/37
whereBelongsTo

You don’t have to compare IDs anymore:
4/37
Invisible Database Columns

It’s a new concept in MySQL 8. What it does: when you run a select * query it won't retrieve any invisible column. If you need an invisible column's value you have to specify it explicitly in the select statement.

And now, Laravel supports this:
5/37
saveQuietly

If you ever need to save a model but you don't want to trigger any model events, you can use this method:
6/37
oldestOfMany

There's a special relationship called oldestOfMany. You can use it if you constantly need the oldest model from a hasMany relationship:
7/37
Default Attribute Values

You can specify default attribute values in migrations and in the Model as well:
8/37
Find with an array of IDs

Everyone knows about the find method, but did you know that it accepts an array of IDs?
9/37
Get Dirty

In Eloquent you can check if a model is "dirty" or not. Dirty means it has some changes that are not persisted yet:
10/37
withDefault

If you have a nullable relationship you can easily end up checking for null values all over the place. Fortunately, the withDefault method solves this problem:
11/37
❗Stop bookmarking

I've put together a 34 pages PDF from these tips. You can download it here (free):

martinjoo.gumroad.com/l/laravel-eloq…
12/37
Boot Eloquent Traits

We all write traits that are being used by Eloquent models. If you need to initialize something in your trait when an event happened in the model, you can boot your trait:
13/37
updateOrCreate

Creating and updating a model often use the same logic. Fortunately Eloquent provides a very convenient method called updateOrCreate.

It will run an update query if the model exists and an insert query if it does not exist:
14/37
upsert

If you want to run multiple update or create operations you can use the upsert:
15/37
when

We often need to append a where clause to a query based on some conditional, for example, a Request parameter. Instead of if statements you can use the when method:
16/37
appends

If you have an attribute accessor and you often need it when the model is converted into JSON you can use the $appends property.

It’s useful when you’re working with Blade:
17/37
latestOfMany

Similarly to oldestOfMany we can use the latestOfMany as well:
18/37
ofMany

You can also use the ofMany relationship with custom logic, for example:
19/37
hasManyThrough

Consider this: Department → has many → Employee → has many → Paycheck

You can define a hasManyThrough relationship on the Department model that will return Paychecks through the Employee model:
20/37
hasManyDeep

Okay, this is clickbait, because there is no hasManyDeep relationship in Laravel but there is an excellent package called eloquent-has-many-deep.

Consider the following relationships:

Country -> has many -> User -> has many -> Post -> has many -> Comment
21/37
Push

Sometimes you need to save a model and its relationship as well. In this case, you can use the push method:
22/37
withAvg

In this example, we have a Book and a Rating model. A book has many ratings. Let's say we need to order the books by the average rating.

We can use the withAvg method:
23/37
Eager Loading Specific Columns

select * queries can be slow and memory-consuming. If you want to eager a relationship but you don't need every column, you can specify which ones you want to load:
24/37
saveMany

With the saveMany function, you can save multiple related models in one function call.
25/37
createMany

Similarly to saveMany you can also use the createMany if you don't have models, but arrays instead:
26/37
foreignId & constrained
27/37
nullOnDelete

If you have a nullable relationship just use the nullOnDelete helper:
28/37
afterCreating

There's an afterCreating method on the Factory class that you can use to do something after a Model has been created.

When I have Users with profile pictures, I always use this feature:
29/37
Factory For

Instead of creating the category and passing it as an attribute, you can use the for method:
30/37
Factory Has

With the has method you can do the inverse of the relationship. So you can use this for has many relationships:
31/37
Factory States

When working with factories in tests (or seeders) we often need a specific 'state' in a given model. Let's say we have a Product model and it has an active column.

You can do this:
32/37
Log Every Database Query

We often want to see every database query that was executed in a request during development. There are multiple solutions, but here's the most simple one:
33/37
whenLoaded

You can avoid N+1 queries in API resources by using the whenLoaded() method. This will only append the department if it’s already loaded in the Employee model.

Without whenLoaded() there is always a query for the department:
34/37
Pagination Links With Query String

If you have pagination in your project and you want to keep the query string from the request URL you can use the withQueryString() method.

Otherwise, your query string will be lost in the pagination links.
35/37

If you have a logic in your application that deletes some old or unused rows from the database, you can use the Prunable trait.

You don't need to write your own command, you can schedule the one provided by Laravel:
36/37

Custom Query Builder

With Eloquent you can define your own query builders for your models. By using this you can move your scopes and queries from your models.

37/37

You made it... You’re a beast! 💪

I have a ton of other tweets like above so give this guy a follow: @mmartin_joo

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Martin Joo

Martin Joo Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @mmartin_joo

Mar 12
🛠️ How to measure performance in Laravel

There are some pretty simple tools you can start measuring your app's performance with:
- ab
- jmeter
- Inspector
- Telescope

🧵 Keep Reading Image
1/14 Here are some of the most important measures of an API/backend service:
- Throughput: the number of requests the system can handle
- Load time: the amount of time it takes for an HTTP request to respond
- Size: the total size of the HTTP response.
2/14 ...measures of an API/backend service

- Server uptime: the duration of time the server is up and running
- CPU usage: the amount of CPU your system needs to run. It is usually expressed as load average
- Memory usage: the amount of memory your system uses
Read 15 tweets
Nov 24, 2023
💡How to integrate 3rd parties into your application?

We have to integrate with a ton of 3rd party APIs, and SDKs in every project. You can treat them as mini-applications inside your app.

🧵Keep Reading Image
1/14

Treat your 3rd parties as if they were mini-applications inside your application. They have their own namespaces with their own DTOs service classes and so on. Something like this: Image
2/14

In the Services folder, I create a new folder for each 3rd party and treat it like it is a mini-application inside my app.

It looks like this: Image
Read 15 tweets
Nov 21, 2023
💡 If you're running PHP or Laravel apps in production you're probably using nginx and php-fpm.

But do you actually know what these terms mean?
- CGI
- FastCGI
- php-fpm
- How do they connect to nginx?

Let's find out!

🧵 Keep Reading
Image
Image
1/9 CGI

CGI stands for Common Gateway Interface. As the name suggests, it's not a package or library. No, it's an interface, a protocol.

CGI gives us a unified way to run scripts from web servers to generate dynamic content. Image
2/9 CGI

It's platform and language-independent so the script can be written in PHP, python, or anything.

CGI uses a "one-process-per-request" model. It means that when a request comes in to the web browser it creates a new process to execute the php script:
Read 10 tweets
Sep 20, 2023
🔥If you struggle to start with CI/CD pipelines here’s a pretty basic but useful one with:

- phpstan analysis
- phpinsight analysis
- unit tests

🧵Keep Reading
Image
Image
1/10

At the beginning of every GitHub workflow, we need to define what is going to trigger it.

In this case, it’ll run if you push to the main branch or you open a PR to it: Image
2/10

In the next section, we can define the jobs. Each job defines a set of steps (for example a script) and these steps run in order.

In this simple example, I only have one job that runs on Ubuntu: Image
Read 11 tweets
Sep 19, 2023
💡 If you're running PHP or Laravel apps in production you're probably using nginx and php-fpm.

But do you actually know what these terms mean?
- CGI
- FastCGI
- php-fpm
- How do they connect to nginx?

Let's find out!

🧵 Keep Reading
Image
Image
1/9 CGI

CGI stands for Common Gateway Interface. As the name suggests, it's not a package or library. No, it's an interface, a protocol.

CGI gives us a unified way to run scripts from web servers to generate dynamic content. Image
2/9 CGI

It's platform and language-independent so the script can be written in PHP, python, or anything.

CGI uses a "one-process-per-request" model. It means that when a request comes in to the web browser it creates a new process to execute the php script:
Read 10 tweets
Sep 11, 2023
Here are my favorite 16 Laravel packages📦

I would immediately DIE without them!

🧵Keep Reading
1/17 laravel-excel

The single best package to handle Excel exports and imports:

- Exporting collections
- Storing files
- Exporting from a query
- Queue jobs
- And more Image
2/17 laravel-health

This amazing Spatie package can monitor the health of your application and server. It sends you notifications if something's wrong. For example:
- CPU load
- Used disk space
- Database connections
- Redis
- and more Image
Read 18 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(