首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel 模型Eloquent ORM 查询

laravel 模型Eloquent ORM 查询

作者头像
风清醉
发布2019-12-18 17:38:46
4.4K0
发布2019-12-18 17:38:46
举报

up前面玩了 DB 查询,但是laravel开发基本不怎么使用db方式查询,应该有更强大的 模型 Model

介绍

Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。

在开始之前,请确保在 config/database.php 中配置数据库连接。更多关于数据库配置的信息,请查看 文档

模型 就是把数据库的表映射到模型类,用面向对象的方式来操作数据库,既然是面向对象自然就可以继承了可以方便的复用。

laravelModel 使用先进的 Eloquent ORM 但也有优缺点

  • 优点是数据库的操作变的简单安全
  • 缺点也明显数据库的操作变的缓慢笨重

Eloquent ORM 作为 laravel 中亮点,Taylor 可是耗费了相当大的精力,用起来当真是没的说

操作-创建个 Model

up这里先创建个 Model,其他就是个类文件。使用的是单数形式帕斯卡命名法 ,也就是首字母大写的驼峰命名法 比如 up之前创建的 test表 Model 命名就是 Test.php

但是呢, laravel 都能 用命令创建控制器生成表跟数据填充了,自然也能生成 模型咯! 直接运行 artisan 命令就行

php artisan make:model Test

运行命令后看到 Model created successfully. 提示就表示model 创建成功了

但是up发现这个文件是建在跟目录下的 app 目录下的

这就坑爹了,表很多的话都生成在这个目录强迫症处女座的up怎么能忍,分分掀桌子的节奏。最后度娘告诉我命令行也是支持目录的,命令改一改就好了。未来方便找up统一就放app目录下的Models目录里

php artisan make:model Models/Test

执行完命令会自动创建 Models 目录

现在有了Model 接下来就是 调用他咯

调用 Model

up 先创建一个新的控制器 TestMdlController在里面写个index方法

<?php

namespace App\Http\Controllers;

use App\Models\Test;
use Illuminate\Http\Request;

class TestMdlController extends Controller
{
    //
    function index(Test $testMdl)
    {
        dump($testMdl->get());
    }
}

建好路由访问下 index

但是却报错了我们看到model生成的sql 莫名其妙拼接了一个 s 这里我百度了一下 artisan 生成的model 若没有特别指定,laravel系统会默认自动对应名称为「Eloquent类名称的小写复数形态」的数据库表 两种方式解决 第一种Eloquent中自定义$table,缺点:如果是重构的项目,表名每个Eloquent都要重新定义可就有的哭了

```   
 protected $table = 'test';
```

第二种添加自定义的Eloquent基类 BaseModel 黑科技可以永绝后患

<?php
    
namespace App\Models;
    
use Illuminate\Database\Eloquent\Model;
    
class BaseModel extends Model
{
    
    //根据model class获取表名 表名中包含_,用驼峰自动转换
    public function getTable()
    {
        return $this->table ? $this->table : class_basename($this);
    }
    
}
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Test extends BaseModel
{
    //
}

以后的模型不要直接由 Eloquent 派生,改为由 BaseModel 派生,就不用特殊指定表名,表名与模型名称直接一致,也不再驼峰呀什么的了。毕竟是黑科技 改造完成后我们在来访问 index 可以看到能正常访问了,这时候我们就通过模型把数据全取出来了

和使用了 DB 取出来的数据一样的是都是一个 Collection 集合,不一样的是 DB 取出来的是数组,Model 取出来的是一个类,需要一层一层的剥开点到 attributes 我们才能看到数据 如果想更直观点查看的话就使用 toArray 方法转成数据

dump($data->toArray());

但是有点写法可能不太明白这种类名跟一个变量直接当参数传给方法的 function index(Test $testMdl) laravel 中大量使用了这种方法,百度了下才知道这个东西叫做 依赖注入 。 当然除了依赖注入的方式我们还可以用传统的方式来玩比如 new 的方式来玩

    function index(Test $testMdl)
    {
        // 依赖注入
        $data = $testMdl->get();
        dump($data->toArray());

        // new 的方式
        $TestMdlNew = new Test();
        dump($TestMdlNew->get()->toArray());
    }

当然也可以直接像调用静态方法

    function index(Test $testMdl)
    {
        // 依赖注入
        $data = $testMdl->get();
        dump($data->toArray());

        // new 的方式
        $TestMdlNew = new Test();
        dump($TestMdlNew->get()->toArray());

        //直接调用静态方法
        dump(Test::get()->toArray());
    }

而且模型可以像 DB 那样链式调用,DB 有的那些方法模型也都有都是可以的 (拖篇幅别介意)

    function get(Test $TestMdl)
    {
        $data = $TestMdl->select('id', 'title', 'describe')
            ->where('title', '<>', '文章1')
            ->whereIn('id', [1, 2, 3])
            ->groupBy('id')
            ->orderBy('id', 'desc')
            ->get()
            ->toArray();
        dump($data);
    }

像 get 里面这一长串方法一样,我们在查询数据的时候经常会有略微复杂的查询把它们写成一个模型方法 比如说在 app/Models/Test.php 文件中写一个 getList 方法

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Test extends BaseModel
{
    /*
     * 获取 test 表指定数据
     */
    function getList(){
        $data = $this->select('id', 'title', 'describe')
            ->where('title', '<>', '文章1')
            ->whereIn('id', [1, 2, 3])
            ->groupBy('id')
            ->orderBy('id', 'desc')
            ->get()
            ->toArray();
        return $data;
    }
}

然后我们就可以在各个地方方便的复用了

    function get(Test $TestMdl)
    {
        $data = $TestMdl->select('id', 'title', 'describe')
            ->where('title', '<>', '文章1')
            ->whereIn('id', [1, 2, 3])
            ->groupBy('id')
            ->orderBy('id', 'desc')
            ->get()
            ->toArray();
        dump($data);

        $data1 = $TestMdl->getList();
        dump($data1);
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 操作-创建个 Model
  • 调用 Model
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档