laravel 模型Eloquent ORM 查询

2019-12-18 17:38:46 浏览数 (1)

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 命令就行

代码语言:javascript复制
php artisan make:model Test

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

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

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

代码语言:javascript复制
php artisan make:model Models/Test

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

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

调用 Model

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

代码语言:javascript复制
<?php

namespace AppHttpControllers;

use AppModelsTest;
use IlluminateHttpRequest;

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

建好路由访问下 index

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

代码语言:javascript复制
```   
 protected $table = 'test';
```

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

代码语言:javascript复制
<?php
    
namespace AppModels;
    
use IlluminateDatabaseEloquentModel;
    
class BaseModel extends Model
{
    
    //根据model class获取表名 表名中包含_,用驼峰自动转换
    public function getTable()
    {
        return $this->table ? $this->table : class_basename($this);
    }
    
}
代码语言:javascript复制
<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Test extends BaseModel
{
    //
}

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

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

代码语言:javascript复制
dump($data->toArray());

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

代码语言:javascript复制
    function index(Test $testMdl)
    {
        // 依赖注入
        $data = $testMdl->get();
        dump($data->toArray());

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

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

代码语言:javascript复制
    function index(Test $testMdl)
    {
        // 依赖注入
        $data = $testMdl->get();
        dump($data->toArray());

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

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

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

代码语言:javascript复制
    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 方法

代码语言:javascript复制
<?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

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;
    }
}

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

代码语言:javascript复制
    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);
    }

0 人点赞