Laravel Eloquent 关联模型 进阶使用技巧

简介: Laravel Eloquent 关联模型 进阶使用技巧

Eloquent关联模型进阶技巧


如何修改父级 updated_at


如果我们想更新一条数据同时更新它父级关联的 updated_at 字段 (例如:我们添加一条文章评论,想同时更新文章的 articles.updated_at),只需要在子模型中使用 $touches = ['article']; 属性。


class Comment extends Model
{
    protected $touches = ['article'];
}


使用 withCount () 统计子关联记录数


如果我们有 hasMany() 的关联,并且我们想统计子关联记录的条数,不要写一个特殊的查询。


例如,如果我们的用户模型上有文章和评论,使用 withCount()


public function index()
{
    $users = User::withCount(['articles', 'comments'])->get();
    return view('users', compact('users'));
}


同时,在 Blade 文件中,我们可以通过使用 {relationship}_count 属性获得这些数量:


@foreach ($users as $user)
<tr>
    <td>{{ $user->name }}</td>
    <td class="text-center">{{ $user->articles_count }}</td>
    <td class="text-center">{{ $user->comments_count }}</td>
</tr>
@endforeach


还可以按照这些统计字段进行排序:


User::withCount('comments')->orderBy('comments_count', 'desc')->get(); 


在关联关系中过滤查询


假如我们想加载关联关系的数据,同时需要指定一些限制或者排序的闭包函数。

例如,我们想获取人口最多的前 5 个国家信息,可以按照如下方式实现:


$countries = Country::with(['contries' => function($query) {
    $query->orderBy('population', 'desc');
    $query->take(5);
}])->get();


动态预加载相关模型


我们不仅可以实现对关联模型的实时预加载,还可以根据情况动态设置某些关联关系,需要在模型初始化方法中处理:


class HobbyTag extends Model
{
    protected $with = ['hobby'];
    public function __construct() {
        parent::__construct();
        $this->with = ['hobby'];
        if (user()->check()) {
            $this->with[] = 'user';
        }
    }
}


使用 hasMany 代替 belongsTo


在关联关系中,如果创建子关系的记录中需要用到父关系的 ID

这种情况下使用 hasMany 比使用 belongsTo 更简洁。

比如:

如果 Post -> belongsTo(User), 并且 User -> hasMany(Post)


Post::create([
    'user_id' => auth()->id(),
    'title' => request()->input('title'),
    'post_text' => request()->input('post_text'),
]);


可以这样创建:


auth()->user()->posts()->create([
    'title' => request()->input('title'),
    'post_text' => request()->input('post_text'),
]);


自定义 pivot 属性名称


如果我们想要重命名「pivot」并用其他的什么方式来调用关系,我们可以在关系声明中使用 ->as('name') 来为关系取名。


模型 Model:


public function podcasts() {
    return $this->belongsToMany('App\Podcast')
        ->as('subscription')
        ->withTimestamps();
}


控制器 Controller:


$podcasts = $user->podcasts();
foreach ($podcasts as $podcast) {
    // instead of $podcast->pivot->created_at ...
    echo $podcast->subscription->created_at;
}


一行代码更新归属关系


如果有一个 belongsTo() 关系,我们可以只用一条语句中更新 Elquent 关系:


// if Project -> belongsTo(User::class)
$project->user->update(['email' => 'wzy@qq.com']);


相关文章
|
存储 关系型数据库 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移1
Django创建应用、ORM的进阶使用及模型类数据库迁移1
117 0
|
关系型数据库 MySQL 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移2
Django创建应用、ORM的进阶使用及模型类数据库迁移2
84 0
|
存储 数据可视化 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移3
Django创建应用、ORM的进阶使用及模型类数据库迁移3
83 0
|
4月前
|
安全 PHP 数据库
laravel中模型中$fillable的用法
通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。
125 1
|
5月前
|
数据库 开发者 Python
Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
|
SQL IDE PHP
Laravel Eloquent 模型 使用技巧
Laravel Eloquent 模型使用技巧
139 0
|
存储 JSON 数据处理
最为常用的Laravel操作(1)-Eloquent模型
整理了 Laravel 框架 Eloquent 模型最常用的操作,包括一些常用的属性、方法,模型关联等。本系列共有 3 篇文章。
78 2
|
PHP UED
Laravel 使用关联模型延迟加载
本文将详细介绍如何在 Laravel 中配置和使用关联模型延迟加载。通过代码示例和演示的代码执行结果,展示了如何利用延迟加载提高应用程序的性能和效率。
133 1
|
数据库 开发者
Yii2.0如何创建一个模型?底层原理是什么?
Yii2.0如何创建一个模型?底层原理是什么?
183 0