up前面玩了 DB
查询,但是laravel开发基本不怎么使用db方式查询,应该有更强大的 模型
Model
介绍
Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。
在开始之前,请确保在 config/database.php
中配置数据库连接。更多关于数据库配置的信息,请查看 文档。
模型
就是把数据库的表映射到模型类,用面向对象的方式来操作数据库,既然是面向对象自然就可以继承了可以方便的复用。
laravel
的 Model
使用先进的 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目录里
代码语言:javascript复制php artisan make:model Models/Test
执行完命令会自动创建 Models 目录
现在有了Model 接下来就是 调用他咯
调用 Model
up 先创建一个新的控制器 TestMdlController
在里面写个index方法
<?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都要重新定义可就有的哭了
```
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
方法转成数据
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());
}
当然也可以直接像调用静态方法
代码语言: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
方法
<?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);
}