资讯专栏INFORMATION COLUMN

【整理】Laravel 中Eloquent ORM 相关操作

dongfangyiyu / 1978人阅读

摘要:软删除当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个属性并插入数据库,如果模型有一个非空值,那么该模型已经被软删除了。

Laravel 中Eloquent ORM 相关操作 定义 操作 获取(查询) 获取集合,(查询列表)
返回值是 IlluminateDatabaseEloquentCollection 的一个实例

获取所有的数据

use AppUser;
$users = User::all();

条件获取列表

$users = User::where("active", 1)
             ->orderBy("name", "desc")
             ->take(10)
             ->get();

获取数据列值

 $result = User::where("gender", "1")->pluck("name");
 // 返回 ["name1","name2 "]

// 该自定义键必须是该表的其它字段列名,否则会报错
$result = User::where("gender", "1")->pluck("email","name");
// 返回 {"name1":"ed9@qq.com","name2":"ed89@qq.com"}
获取单个模型,(查询单条数据)
// 通过主键获取模型
$user = User::find(1);

// 获取匹配查询条件的第一个模型...
$user = User::where("active", 1)->first();
//  返回第一个gender为1的用户的名字
$name = User::where("gender", "1")->value("name");

// 传递主键数组来调用 find 方法,这将会返回匹配记录集合:
$users = AppFlight::find([1, 2, 3]);
如果没有任何查询结果,IlluminateDatabaseEloquentModelNotFoundException 异常将会被抛出:
$model = AppFlight::findOrFail(1);
$model = AppFlight::where("legs", ">", 100)->firstOrFail();
处理结果集
$result = User::where("gender", "1")->chunk(5, function($users) {
            foreach ($users as $user) {
                $name = $user->name;
                echo $name;
            }
}) // 输出名字
// result 为 boolean  

$result = User::where("gender", "1")->chunk(5, function($users) {
            foreach ($users as $user) {
              $name = $user->name;
              if ($name == "dxx5") {
                 echo $name;
                 return false;
              }
           }
}) // 找出某个名字   
聚合方法
// 获取总数
$count = Flight::where("active", 1)->count();
// 获取最大值
$max = Flight::where("active", 1)->max("price");
//平均值
$max = Flight::where("active", 1)->avg("price");
条件查询

select查询

    // 查询名字和email
    $users = User::select("name","email as user_email")->get();
    // 返回 [{"name":"name1","user_email":"1@qq.com"}]

    // 查询构建器实例,添加一个查询列到已存在的 select 子句
    $user = User::select("name");
    $users = $user->addSelect("gender")->get();
        

联合

$first = DB::table("users")
            ->whereNull("first_name");

$users = DB::table("users")
            ->whereNull("last_name")
            ->union($first)
            ->get();

注:unionAll 方法也是有效的,并且和 union 有同样的使用方式

Where子句

$users = User::where("gender", "=", 1)->get(); // 男性用户
$users = User::where("gender", 1)->get(); // 同上

$users = User::where("age", ">=", 10)->get(); // 10岁以上用户
$users = User::where("age", "<>", 10)->get(); // 非10岁用户
$users = User::where("name", "like", "d%")->get(); // 名字为d开头的用户
$users = User::where("name", "like", "%d%")->get(); // 名字含d的用户

// 传递条件数组到 where 函数:
$users = User::where([["gender", "=", "1"],["age", ">", "10"]])->get(); //10岁以上的男孩

// or语句
$users = User::where("gender", "=", 1)->orWhere("age", ">", "10")->get();

其他where语句

// whereBetween 方法验证列值是否在给定值之间:
$users = User::whereBetween("age", [1, 7])->get(); // 1-7岁的用户
// whereNotBetween 方法验证列值不在给定值之间:
$users = User::whereNotBetween("age", [1, 7])->get(); // 1-7岁以外的用户

// whereIn 方法验证给定列的值是否在给定数组中:
$users = User::whereIn("id", [1, 2, 3])->get();
// whereNotIn 方法验证给定列的值不在给定数组中:
$users = User::whereNotIn("id", [1, 2, 3])->get();

// whereNull 方法验证给定列的值为NULL:
$users = User::whereNull("updated_at")->get();
// whereNotNull 方法验证给定列的值不是 NULL:
$users = User::whereNotNull("updated_at")->get();

// whereDate 方法用于比较字段值和日期:
$users = User::whereDate("created_at", "2018-05-10")->get(); // 20180510注册的用户
// whereMonth 方法用于比较字段值和一年中的指定月份:
$users = User::whereMonth("created_at", "10")->get();
// whereDay 方法用于比较字段值和一月中的制定天:
$users = User::whereDay("created_at", "10")->get();
whereYear 方法用于比较字段值和指定年:
$users = User::whereYear("created_at", "2016")->get();

// whereColumn 方法用于验证两个字段是否相等,也可以传递一个比较运算符到该方法:
$users = User::whereColumn("first_name", "last_name")->get();
$users = User::whereColumn("updated_at", ">", "created_at")->get();
        
// 还可以传递多条件数组到 whereColumn 方法,这些条件通过 and 操作符进行连接:
$users = User::whereColumn([
                ["first_name", "=", "last_name"],
                ["updated_at", ">", "created_at"]
            ])->get();

参数分组

$users = User::where("name", "=", "xxx")
        ->orWhere(function ($query) {
           $query->where("age", ">", 5)
                 ->where("gender", 1);
        })
        ->get(); // xxx或大于5岁的男孩

where exit

$users = User::whereExists(function ($query) {
                $query->select(DB::raw(1))
                      ->from("articles")
                      ->whereRaw("articles.user_id = users.id");
})->get(); // 写过文章的用户
            
排序
$users = User::orderBy("age", "desc")->get(); // 年龄倒序
$user = User::latest()->first(); //crate_at  最晚的那个
$user = User::oldest()->first(); //crate_at  最早的那个
$users = User::inRandomOrder()->first(); // 随机用户
限定
$users = User::skip(2)->take(3)->get(); // 跳过前2个取中间3个
$users = User::offset(2)->limit(3)->get(); // 同上
分组
$users = User::groupBy("name")->having("age", ">", 10)->get(); // 大于10的用户

// 找到所有售价大于 $2,500 的部分, 没理解
$users = User::select("department", DB::raw("SUM(price) as total_sales"))
    ->groupBy("department")
    ->havingRaw("SUM(price) > 2500")
    ->get();
when 条件子句
$sortBy = null; // 当sortBy为null,默认name排序
$users = User::when($sortBy, 
            function ($query) use ($sortBy) {
                return $query->orderBy($sortBy);
            }, function ($query) {
                return $query->orderBy("name");
            })
            ->get();
分页
$users = User::paginate(3);
$users->appends(["sort" => "name"])->links(); // 修改的是连接
$users->withPath("custom/url");
// 约束条件
$users = User::where("id", ">", 2)->paginate(2);
$users = User::where("id", ">", 2)->simplePaginate(2);
return $users->toArray();

返回结果:

当调用 paginate 方法时,你将获取IlluminatePaginationLengthAwarePaginator 实例,
调用方法simplePaginate 时,将会获取 IlluminatePaginationPaginator 实例。(不需要知道结果集中数据项的总数)
{
    "current_page" : 1
    "data": [{"id":1,"name":"name1"},{"id":2,"name":"name2"}]
    "from":1
    "last_page":2
    "next_page_url":"http://localhost:8888/user/page?page=2"
    "path":"http://localhost:8888/user/page"
    "per_page":3
    "prev_page_url":null
    "to":3
    "total":6
}

每个分页器实例都可以通过以下方法提供更多分页信息:

$results->count()
$results->currentPage()
$results->firstItem()
$results->hasMorePages()
$results->lastItem()
$results->lastPage() (使用simplePaginate 时无效)
$results->nextPageUrl()
$results->perPage()
$results->previousPageUrl()
$results->total() (使用simplePaginate 时无效)
$results->url($page)
插入

插入

$user = new User;
$user->name = "username";
$user->fill(["grade" => "2"]); // 使用 fill 方法通过数组属性来填充
$user->save();

$row = array("name" => str_random(3),"email" => str_random(3)."@qq.com")
$user = User::create($row); // 返回模型对象
$id = User::insertGetId($row); // 插入记录并返回ID值

$success = User::nsert([
    ["email" => "taylor@example.com", "votes" => 0],
    ["email" => "dayle@example.com", "votes" => 0]
]); // 插入多条
更新

单个更新

$user = User::find(1);
$user->name = "new name";
$user->save();

批量更新

User::where("gender", 1)->update(["age" => 1]); 

自增自减

$result = User::increment("age"); // 返回修改的行数
$result = User::increment("age", 2);
$result = User::decrement("age");
$result = User::decrement("age", 2);
$result = User::increment("age",1,["gender" => 1]); // 年龄自增1 且 性别改为1

其他创建方法

$user = User::firstOrCreate(["name" => "Flight 10"]); // 不存在则创建
$user = User::firstOrNew(["name" => "Flight 10"]); // 如果不存在初始化一个新的实$user = User::updateOrCreate(
    ["name" => "username", "age" => "16"],
    ["grade" => 3]
); // 将 16岁的username 改成3年级,没有则创建
删除
$user = User::find(1);
$user->delete(); // 通过主键查询后,删除模型

User::destroy(1); // 直接通过主键删除
User::destroy([1, 2, 3]);
User::destroy(1, 2, 3);

$deletedRows = User::where("age", 0)->delete(); //查询 删除
// 注:通过 Eloquent 批量删除时,deleting 和 deleted 事件不会被触发,因为在进行模型删除时不会获取模型。

软删除

当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个 deleted_at 属性并插入数据库,如果模型有一个非空 deleted_at 值,那么该模型已经被软删除了。

启用模型的软删除功能,可以使用模型上的IlluminateDatabaseEloquentSoftDeletes trait并添加 deleted_at 列到 $dates 属性:

softDeletes();
});

现在,当调用模型的 delete 方法时,deleted_at 列将被设置为当前日期和时间.
当查询一个使用软删除的模型时,被软删除的模型将会自动从查询结果中排除。

软删除的查询

判断给定模型实例是否被软删除,可以使用 trashed 方法:
if ($flight->trashed()) {
    //
}

// 如果你想要软删除模型出现在查询结果中,可以使用 withTrashed 方法:
$flights = AppFlight::withTrashed()
            ->where("account_id", 1)
            ->get();
            
// withTrashed 方法也可以用于关联查询中:
$flight->history()->withTrashed()->get();

// onlyTrashed 方法只获取软删除模型:
$flights = AppFlight::onlyTrashed()
            ->where("airline_id", 1)
            ->get();
            
// 恢复软删除模型,使用restore 方法:
$flight->restore();

// 快速恢复多个模型,同样,这也不会触发任何模型事件:
AppFlight::withTrashed()
    ->where("airline_id", 1)
    ->restore();
    
// 也可以用于关联查询:
$flight->history()->restore();

// 永久删除模型,可以使用 forceDelete 方法:

$flight->forceDelete(); // 强制删除单个模型实例...
$flight->history()->forceDelete(); // 强制删除所有关联模型...

关于查询作用域,模型事件,查看移步官网文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30781.html

相关文章

  • 整理LaravelEloquent ORM 关联关系的操作

    摘要:从属关联关系更新关联使用方法,该方法会在子模型设置外键移除关联的时候,使用方法。使得这项操作变得简单,只需要添加包含关联关系名称的属性到子模型即可触发的所有关联关系关联关系更新时,所属模型将也会更新其值 Laravel中Eloquent ORM 关联关系的操作 关联数据 定义关联关系 一对一

    bovenson 评论0 收藏0
  • windows下laravel5.5手写教程2路由Eloquent ORM操作(适合初学者)

    摘要:一路由目录众所周知,对于我们熟知的任何一款框架,例如路由系统都是极其重要的存在。文件用于定义界面的路由。定义在中的路由都是无状态的,并且被分配了中间件组。生成的控制器为每个行为保留了方法,同时还包括了处理动作和的声明注释。 一、路由目录 众所周知,对于我们熟知的任何一款PHP框架,例如TP、CI、YII、路由系统都是极其重要的存在。 对于laravel框架也一样,对于数据库的操作,无非...

    BlackFlagBin 评论0 收藏0
  • LaravelLaravel 框架关键技术解析·读书笔记(一)

    摘要:判断是否存在构造函数,不存在直接实例化,存在则通过来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。 Laravel 框架关键技术解析·读书笔记(一) 第一章 入口文件 请求访问的入口文件,主要完成几部分工作,分别是: 自动加载函数的添加 服务器实例化与服务注册 路由加载 请求实例化与路由分发 相应生成与发送 其中,自动加载函数用于包含引用文件,改文件是composer...

    CocoaChina 评论0 收藏0
  • laravel5.5手写教程4Eloquent ORM分页及软删除

    摘要:从而达到了软删除。不过,你可以通过在查询中调用方法来强制查询已被软删除的模型方法也可以被用在关联查询只取出软删除数据会只取出软删除数据恢复被软删除的模型有时候你可能希望取消删除一个已被软删除的模型。 Laravel 有三宝,路由、容器和 Eloquent ORM,Eloquent ORM。我个人一直比较推荐于在实际操作中学习,之前简单了解了路由和Eloquent ORM的基本用法,今天...

    mindwind 评论0 收藏0
  • laravel 数据迁移与 Eloquent ORM

    摘要:同时使用数据迁移管理数据库,可以与团队进行共享以及编辑。实际项目根据需求进行记录,以及选择存储方式。使用命令可以很方便的创建模型以及数据迁移。,参数在创建模型的同时也创建了数据迁移文件。参考资料数据库操作迁移快速入门。 导语 数据库可以说是后端开发最常用,也是最重要的部分。laravel 提供了很实用的 Eloquent ORM 模型类,简单、直观的与数据库进行交互。同时使用数据迁移管...

    tulayang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<