Laravel Eloquent 模型 进阶技巧

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

Laravel Eloquent 模型使用进阶技巧


列名重命名


在 Eloquent Query Builder 中,可以使用 as 重命名列名称进行输出,比如:


$users = DB::table('users')->select('name', 'email as my_email')->get();


Map 查询结果


在 Eloquent 查询之后,可以使用 Collections 中的 map() 函数来修改行。


$users = User::where('role_id', 1)->get()->map(function (User $user) {
    $user->some_column = some_function($user);
    return $user;
});


这里在对比一下 数组array 的map()用法:


$userIds = array_map(function ($value) {
    return ['userid' => $value];
}, $appointmentsUserIds);
返回的数据是
[['userid'=xxxx],['userid'=xxxx],]


根据时间字段快速排序


不建议使用:


User::orderBy('created_at', 'desc')->get();


建议使用下述方法执行效率更快:


User::latest()->get();


默认情况下,latest() 会按 created_at 降序排序。


有一个相反的方法 oldest(),它按 created_at 升序排序:


User::oldest()->get();


可以指定时间字段进行排序


$lastUpdatedUser = User::latest('updated_at')->first();


原始SQL查询


使用类似 whereRaw() 方法的 SQL 原始查询,直接在查询中进行一些特定于数据库的计算,而不是在 Laravel 中,通常结果会更快。


例如,获得注册后 10 天以上仍处于活跃状态的用户,可以使用以下代码:


User::where('active', 1)
->whereRaw('TIMESTAMPDIFF(DAY, created_at, updated_at) > ?', 10)
->get();


多个范围查询


在 Eloquent 中组合和链式查询范围,在查询中使用多个范围。


模型:


public function scopeActive($query) {
    return $query->where('active', 1);
}
public function scopeRegisteredWithinDays($query, $days) {
    return $query->where('created_at', '>=', now()->subDays($days));
}


控制器中使用:


$users = User::registeredWithinDays(10)->active()->get();


无需转换 Carbon


如果使用 whereDate() 查询今日的记录,可以直接使用 Carbon 的 now() 方法,会自动转换为日期进行查询,无需指定 ->toDateString():


// 今日注册的用户
$todayUsers = User::whereDate('created_at', now()->toDateString())->get();
// 无需 toDateString() ,直接 now() 即可
$todayUsers = User::whereDate('created_at', now())->get();


永不更新某个字段


如果有一个数据库字段需要只更新一次,可以使用 Eloquent 的修改器来实现:


class User extends Model
{
    public function setEmailAttribute($value)
    {
        //有值则不设置
        if ($this->email) {
            return;
        }
        $this->attributes['email'] = $value;
    }
}


find () 查询多条数据


find() 不止可以查询一条数据,当传入多个 ID 的值会返回这些结果的集合:


// 返回 Eloquent Model
$user = User::find(1);
// 返回 Eloquent Collection
$users = User::find([1,2,3]);


find () 限制字段


find() 可在查询多条的数据的情况下,指定只返回哪些字段:


// 会返回只包含 first_name 和 email 的 Eloquent 模型
$user = User::find(1, ['first_name', 'email']);
// 会返回只包含 first_name 和 email 两个字段的 Eloquent 集合
$users = User::find([1,2,3], ['first_name', 'email']);


相关文章
|
26天前
|
安全 PHP 数据库
laravel中模型中$fillable的用法
通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。
11 1
|
SQL IDE PHP
Laravel Eloquent 模型 使用技巧
Laravel Eloquent 模型使用技巧
122 0
|
存储 JSON 数据处理
最为常用的Laravel操作(1)-Eloquent模型
整理了 Laravel 框架 Eloquent 模型最常用的操作,包括一些常用的属性、方法,模型关联等。本系列共有 3 篇文章。
66 2
|
PHP 数据库
你可能不知道的 Laravel Eloquent 操作
你可能不知道的 Laravel Eloquent 操作
94 0
Laravel Eloquent 关联模型 进阶使用技巧
Laravel Eloquent 关联模型 进阶使用技巧
137 0
|
SQL 存储 缓存
Django入门-5:模型的基本使用4-模型查询
Django入门-5:模型的基本使用4-模型查询
146 0
|
SQL 存储 前端开发
Django入门-5:模型的基本使用1-模型定义
Django入门-5:模型的基本使用1-模型定义
139 0
Django入门-5:模型的基本使用1-模型定义
|
存储 SQL 前端开发
Django入门:第八章、模板引擎设置
Django入门:第八章、模板引擎设置
129 0
Django入门:第八章、模板引擎设置
|
存储 程序员 数据库
Django入门:第四章、模型设计
Django入门:第四章、模型设计