Home PHP Framework Laravel Essential practical tips for Laravel Eloquent

Essential practical tips for Laravel Eloquent

Dec 23, 2019 pm 05:41 PM
laravel

Necessary practical skills for Laravel Eloquent

1. Increment and decrement

To replace the following implementation:

$article = Article::find($article_id);
$article->read_count++;
$article->save();
Copy after login

You can do this:

$article = Article::find($article_id);
$article->increment('read_count');
Copy after login

The following methods can also be implemented:

Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // +10
Product::find($produce_id)->decrement('stock'); // -1
Copy after login

2. Execute the Use, for example "Please execute method X first, if method X fails, execute method Y".

Example 1 -- findOrFail():

To replace the implementation of the following code:

$user = User::find($id);
if (!$user) { abort (404); }
Copy after login

You can write like this:

$user = User::findOrFail($id);
Copy after login

Example 2 -- firstOrCreate():

To replace the implementation of the following code:

$user = User::where('email', $email)->first();
if (!$user) {
  User::create([
    'email' => $email
  ]);
}
Copy after login

Just write it like this:

$user = User::firstOrCreate(['email' => $email]);
Copy after login

3. The model's boot() method

In an Eloquent model, there is a magical place called boot(), where you can override the default behavior:

class User extends Model
{
    public static function boot()
    {
        parent::boot();
        static::updating(function($model)
        {
            // 写点日志啥的
            // 覆盖一些属性,类似这样 $model->something = transform($something);
        });
    }
}
Copy after login

Set the values ​​of certain fields when creating the model object, probably the most One of the popular examples. Let’s take a look at what to do if you want to generate a UUID field when creating a model object.

public static function boot()
{
  parent::boot();
  self::creating(function ($model) {
    $model->uuid = (string)Uuid::generate();
  });
}
Copy after login

4. Association with conditions and sorting

General way to define association:

public function users()
{
    return $this->hasMany('App\User');
}
Copy after login

Do you know? You can also add where or orderBy on the basis of the above,

For example, if you want to associate certain types of users and use the email field to sort at the same time, you can do this:

public function approvedUsers() {
    return $this->hasMany('App\User')->where('approved', 1)->orderBy('email');
}
Copy after login

5. Model features: time, append, etc.

Some parameters of the Eloquent model are in the form of class attributes. The most commonly used ones are:

class User extends Model
{
    protected $table = 'users';
    protected $fillable = ['email', 'password']; // 可以被批量赋值字段,如 User::create() 新增时,可使用字段
    protected $dates = ['created_at', 'deleted_at']; // 需要被Carbon维护的字段名
    protected $appends = ['field1', 'field2']; // json返回时,附加的字段
}
Copy after login

Not only these, but also:

protected $primaryKey = 'uuid'; // 更换主键
public $incrementing = false; // 设置 不自增长
protected $perPage = 25; // 定义分页每页显示数量(默认15)
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at'; //重写 时间字段名
public $timestamps = false; // 设置不需要维护时间字段
Copy after login

There are more. I only listed some interesting features. Please refer to the document abstract Model class for details.

6. Query multiple records by ID

Everyone knows the find() method, right?

$user = User::find(1);
Copy after login

I am very surprised that few people know that this method can accept arrays of multiple IDs as parameters:

$users = User::find([1,2,3]);
Copy after login

7. WhereX

There is an elegant way to This kind of code:

$users = User::where('approved', 1)->get();
Copy after login

Convert to this kind of code:

$users = User::whereApproved(1)->get();
Copy after login

Yes, you read it right, use the field name as a suffix and add it to where after, and it will run through the magic method.

In addition, there are some predefined methods related to time in Eloquent:

User::whereDate('created_at', date('Y-m-d'));
User::whereDay('created_at', date('d'));
User::whereMonth('created_at', date('m'));
User::whereYear('created_at', date('Y'));
Copy after login

8. Sorting by relationship

A more complicated "technique". Do you want to sort forum topics by latest posts? It’s a common requirement to have the most recently updated topics in a forum at the top, right?

First, define a separate relationship for the latest post of the topic:

public function latestPost()
{
    return $this->hasOne(\App\Post::class)->latest();
}
Copy after login

Then, in the controller, we can implement this "magic":

$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
Copy after login

9. Eloquent::when() -- No more using if-else

Many people like to use "if-else" to write query conditions, like this:

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}
Copy after login

There is a better way Method--use when()

$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});
Copy after login

It may not look very elegant, but its powerful function is to pass parameters:

$query = User::query();
$query->when(request('role', false), function ($q, $role) {
    return $q->where('role_id', $role);
});
$authors = $query->get();
Copy after login

10. BelongsTo default model

If There is a Post model attached to the Author model, and the following code can be written in the Blade template:

{{ $post->author->name }}
Copy after login

But what if the author is deleted, or is not set for some reason? You will get an error message like "non-existent object property".

Well, you can avoid it like this:

{{ $post->author->name ?? '' }}
Copy after login

But you can do this effect at the Eloquent relational model level:

public function author()
{
    return $this->belongsTo('App\Author')->withDefault();
}
Copy after login

In this example, if the post has no author Otherwise, the author() relationship method will return an empty App\Author model object.

In addition, we can also assign a default attribute value to the default model.

public function author()
{
    return $this->belongsTo('App\Author')->withDefault([
        'name' => 'Guest Author'
    ]);
}
Copy after login

11. Sorting by assignment function

Imagine you have this code:

function getFullNameAttribute()
{
  return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}
Copy after login

Now, you want to sort by "full_name"? Found that there is no The effect:

$clients = Client::orderBy('full_name')->get(); //没有效果
Copy after login

The solution is very simple. We need to sort the results after getting them.

$clients = Client::get()->sortBy('full_name'); // 成功!
Copy after login

Note that the method names are different--it is not orderBy, but sortBy

12. Default sorting under global scope

What if you want User::all() to always sort by the name field? You can assign it a global scope. Let's go back to the boot() method we mentioned above:

protected static function boot()
{
    parent::boot();
    // 按照 name 正序排序
    static::addGlobalScope('order', function (Builder $builder) {
        $builder->orderBy('name', 'asc');
    });
}
Copy after login

Extended reading Query scope.

13. Native query method

Sometimes, we need to add native queries to Eloquent statements. Fortunately, there is a way.

// whereRaw
$orders = DB::table('orders')
    ->whereRaw('price > IF(state = "TX", ?, 100)', [200])
    ->get();
// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();
// orderByRaw
User::where('created_at', '>', '2016-01-01')
  ->orderByRaw('(updated_at - created_at) desc')
  ->get();
Copy after login

14. Copy: Copy a row

It’s very simple. The explanation is not very in-depth, but here is the best way to copy a database entity (a piece of data):

$task = Tasks::find(1);
$newTask = $task->replicate();
$newTask->save();
Copy after login

15. Chunk() method of large chunks of data

is not completely related to Eloquent, it is more More about Collection (collection), but it is still very useful for processing large data collections. You can use chunk() to split this data into small data chunks

Before modification:

$users = User::all();
foreach ($users as $user) {
    // ...
Copy after login

You can do this:

User::chunk(100, function ($users) {
    foreach ($users as $user) {
        // ...
    }
});
Copy after login

16. Add extra when creating the model Operation

We all know this Artisan command:

php artisan make:model Company
Copy after login

But you know that there are three very useful identifiers that can be used to generate model related files

php artisan make:model Company -mcr
Copy after login

-m Create migration files

-c Create controller file

-r Add resource operation method to controller

17. Specify updated_at

when calling the save method

你知道 ->save() 方法可以接受参数吗? 我们可以通过传入参数阻止它的默认行为:更新 updated_at 的值为当前时间戳。

$product = Product::find($id);
$product->updated_at = '2019-01-01 10:00:00';
$product->save(['timestamps' => false]);
Copy after login

这样,我们成功在 save 时指定了 updated_at 的值。

18. update() 的结果是什么?

你是否想知道这段代码实际上返回什么?

$result = $products->whereNull('category_id')->update(['category_id' => 2]);
Copy after login

我是说,更新操作是在数据库中执行的,但 $result 会包含什么?

答案是受影响的行。 因此如果你想检查多少行受影响, 你不需要额外调用其他任何内容 -- update() 方法会给你返回此数字。

19. 把括号转换成 Eloquent 查询

如果你有个 and 和 or 混合的 SQL 查询,像这样子的:

... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
Copy after login

怎么用 Eloquent 来翻译它呢? 下面是一种错误的方式:

$q->where('gender', 'Male');
$q->orWhere('age', '>=', 18);
$q->where('gender', 'Female');
$q->orWhere('age', '>=', 65);
Copy after login

顺序就没对。正确的打开方式稍微复杂点,使用闭包作为子查询:

$q->where(function ($query) {
    $query->where('gender', 'Male')
        ->where('age', '>=', 18);
})->orWhere(function($query) {
    $query->where('gender', 'Female')
        ->where('age', '>=', 65);
})
Copy after login

20. 复数参数的 orWhere

终于,你可以传递阵列参数给 orWhere()。平常的方式:

$q->where('a', 1);
$q->orWhere('b', 2);
$q->orWhere('c', 3);
Copy after login

你可以这样做:

$q->where('a', 1);
$q->orWhere(['b' => 2, 'c' => 3]);
Copy after login

更多laravel框架相关技术文章,请访问laravel教程栏目!

The above is the detailed content of Essential practical tips for Laravel Eloquent. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Comparison of the latest versions of Laravel and CodeIgniter Comparison of the latest versions of Laravel and CodeIgniter Jun 05, 2024 pm 05:29 PM

The latest versions of Laravel 9 and CodeIgniter 4 provide updated features and improvements. Laravel9 adopts MVC architecture and provides functions such as database migration, authentication and template engine. CodeIgniter4 uses HMVC architecture to provide routing, ORM and caching. In terms of performance, Laravel9's service provider-based design pattern and CodeIgniter4's lightweight framework give it excellent performance. In practical applications, Laravel9 is suitable for complex projects that require flexibility and powerful functions, while CodeIgniter4 is suitable for rapid development and small applications.

How do the data processing capabilities in Laravel and CodeIgniter compare? How do the data processing capabilities in Laravel and CodeIgniter compare? Jun 01, 2024 pm 01:34 PM

Compare the data processing capabilities of Laravel and CodeIgniter: ORM: Laravel uses EloquentORM, which provides class-object relational mapping, while CodeIgniter uses ActiveRecord to represent the database model as a subclass of PHP classes. Query builder: Laravel has a flexible chained query API, while CodeIgniter’s query builder is simpler and array-based. Data validation: Laravel provides a Validator class that supports custom validation rules, while CodeIgniter has less built-in validation functions and requires manual coding of custom rules. Practical case: User registration example shows Lar

Laravel - Artisan Commands Laravel - Artisan Commands Aug 27, 2024 am 10:51 AM

Laravel - Artisan Commands - Laravel 5.7 comes with new way of treating and testing new commands. It includes a new feature of testing artisan commands and the demonstration is mentioned below ?

Which one is more beginner-friendly, Laravel or CodeIgniter? Which one is more beginner-friendly, Laravel or CodeIgniter? Jun 05, 2024 pm 07:50 PM

For beginners, CodeIgniter has a gentler learning curve and fewer features, but covers basic needs. Laravel offers a wider feature set but has a slightly steeper learning curve. In terms of performance, both Laravel and CodeIgniter perform well. Laravel has more extensive documentation and active community support, while CodeIgniter is simpler, lightweight, and has strong security features. In the practical case of building a blogging application, Laravel's EloquentORM simplifies data manipulation, while CodeIgniter requires more manual configuration.

Laravel vs CodeIgniter: Which framework is better for large projects? Laravel vs CodeIgniter: Which framework is better for large projects? Jun 04, 2024 am 09:09 AM

When choosing a framework for large projects, Laravel and CodeIgniter each have their own advantages. Laravel is designed for enterprise-level applications, offering modular design, dependency injection, and a powerful feature set. CodeIgniter is a lightweight framework more suitable for small to medium-sized projects, emphasizing speed and ease of use. For large projects with complex requirements and a large number of users, Laravel's power and scalability are more suitable. For simple projects or situations with limited resources, CodeIgniter's lightweight and rapid development capabilities are more ideal.

Questions and Answers on PHP Enterprise Application Microservice Architecture Design Questions and Answers on PHP Enterprise Application Microservice Architecture Design May 07, 2024 am 09:36 AM

Microservice architecture uses PHP frameworks (such as Symfony and Laravel) to implement microservices and follows RESTful principles and standard data formats to design APIs. Microservices communicate via message queues, HTTP requests, or gRPC, and use tools such as Prometheus and ELKStack for monitoring and troubleshooting.

Laravel vs CodeIgniter: Which framework is better for small projects? Laravel vs CodeIgniter: Which framework is better for small projects? Jun 04, 2024 pm 05:29 PM

For small projects, Laravel is suitable for larger projects that require strong functionality and security. CodeIgniter is suitable for very small projects that require lightweight and ease of use.

Which is the better template engine, Laravel or CodeIgniter? Which is the better template engine, Laravel or CodeIgniter? Jun 03, 2024 am 11:30 AM

Comparing Laravel's Blade and CodeIgniter's Twig template engine, choose based on project needs and personal preferences: Blade is based on MVC syntax, which encourages good code organization and template inheritance. Twig is a third-party library that provides flexible syntax, powerful filters, extended support, and security sandboxing.

See all articles