Laravel Eloquent 模型 使用技巧

简介: Laravel Eloquent 模型使用技巧

Laravel Eloquent 模型使用技巧


query ()


  1. 使用 query() 在PhpStorm这类IDE中会自动补全方法
  2. 使用 query() 能简化代码逻辑,实现更优雅


举例


不使用query


if($status && $type) {
 $users = User::where('status', $status)->where('type', $type)->latest()->get();
 } else if ($status) {
 $users = User::where('status', $status)->latest()->get(); 
 } else if ($type) {
 $users = User::where('status', $type)->latest()->get();
 } else {
 $users = User::latest()->get(); 
 }


使用query


$query = User::query();
 if ($status) {
  $query->where('status', $status);
 }
 if ($type) {
  $query->where('type', $type);
 } 
 $users = $query->latest()->get();


复用或克隆 query ()


上面的栗子介绍了 query 的使用,下面介绍一种特殊情况,需要我们注意:有时候需要克隆 query()


场景:获取今天创建的已激活和未激活的产品


$query = Product::query();
$today = request()->date ?? today();
if($today){
    $query->where('created_at', $today);
}
//获取已激活和未激活的产品
$active_products = $query->where('status', 1)->get(); // 这一行修改了 $query 对象变量
$inactive_products = $query->where('status', 0)->get(); // 所以这里我们不会找到任何未激活的产品


$inactive_products没有按期望渠道值,因为$query的值在每次执行时都会改变。 上述查询语句转成sql相当于是


where status = 1 and startus = 2


为了解决这个问题,我们可以通过复用这个 $query 对象来进行多次查询。


我们可以通过克隆这个 $query 来解决问题,如下:


$active_products = (clone $query)->where('status', 1)->get(); // 它不会修改 $query
$inactive_products = (clone $query)->where('status', 0)->get(); // 所以我们将从 $query 中获取未激活的产品


Eloquent where 日期方法


在 Eloquent 中,使用 whereDay()whereMonth()whereYear()whereDate()whereTime() 函数检查日期。


非常的灵活,同时强力安利 Carbon


$products = Product::whereDate('created_at', '2020-01-31')->get();
$products = Product::whereMonth('created_at', '11')->get();
$products = Product::whereDay('created_at', '28')->get();
$products = Product::whereYear('created_at', date('Y'))->get();
$products = Product::whereTime('created_at', '=', '19:23:18')->get();


增量和减量


如果要增加数据库某个表中的某个列,只需使用 increment() 函数。你不仅可以增加 1,还可以增加一些数字,比如 50。

减量使用decrement()函数,使用方式和增量一致。


Post::find($post_id)->increment('view_count');
User::find($user_id)->increment('points', 50);
Post::find($post_id)->decrement('comment_count');
User::find($user_id)->decrement('fans_count', 50);


定义 timestamp 列


如果数据库表不包含 timestamp 字段 created_atupdated_at,可以使用 $timestamps = false 属性指定 Eloquent 模型不使用它们。


class Company extends Model
{
    public $timestamps = false;
}


也可以指定timestamp字段,使用其他字段代替 created_atupdated_at


class Company extends Model
{
    public $timestamps = true;
    const CREATED_AT = 'createtime';
    const UPDATED_AT = 'updatetime';
}


模型 all:列


当调用 Eloquent 的 Model::all() 时,可以指定要返回的列。


$users = User::all(['id', 'name', 'sex']);


失败或不失败


除了 findOrFail() 之外,还有 Eloquent 方法 firstOrFail(),如果没有找到查询记录,它将返回 404 页。


$user = User::where('email', 'ucenter@juejin.cn')->firstOrFail();


相关文章
|
3月前
|
SQL 关系型数据库 PHP
深入理解 Laravel 的 ORM:Eloquent
【8月更文挑战第31天】
69 0
|
4月前
|
安全 PHP 数据库
laravel中模型中$fillable的用法
通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。
122 1
|
4月前
|
测试技术 PHP 数据库
深入解析PHP框架:Symfony框架详解与应用
📚 Symfony框架深度解析:模块化设计提升开发效率,性能优越,灵活性高,支持MVC模式。探索控制器、路由、模板(如Twig)、服务容器、事件调度器等核心概念。还包括表单处理、数据库集成( Doctrine ORM)、安全组件、国际化支持及调试工具。使用Symfony CLI快速创建应用,内置PHPUnit测试支持。开始你的高质量Web开发之旅吧!
73 2
|
存储 JSON 数据处理
最为常用的Laravel操作(1)-Eloquent模型
整理了 Laravel 框架 Eloquent 模型最常用的操作,包括一些常用的属性、方法,模型关联等。本系列共有 3 篇文章。
77 2
|
数据库连接 PHP 数据库
Yii2如何使用ActiveRecord?
Yii2如何使用ActiveRecord?
150 0
|
PHP 数据库
你可能不知道的 Laravel Eloquent 操作
你可能不知道的 Laravel Eloquent 操作
105 0
|
SQL PHP 数据库
Laravel Eloquent 模型 进阶技巧
Laravel Eloquent 模型使用进阶技巧
146 0
Laravel Eloquent 关联模型 进阶使用技巧
Laravel Eloquent 关联模型 进阶使用技巧
149 0
新版本 Laravel Eloquent 关联模型 使用技巧
新版本 Laravel Eloquent 关联模型 使用技巧
129 0