梦入琼楼寒有月,行过石树冻无烟

Laravel Eloquent ORM

Laravel Eloquent ORM即“数据操作”,在前面我们所介绍的数据库当中,使用的是“DB”而Laravel还为我们提供了另一种更加优雅的方式,即”Laravel Eloquent ORM”。如果将两者作为比较的话,那么Laravel所提供的另一种数据库操作方式Laravel Eloquent ORM则更加的安全和优雅,其操作和语法类似与Spring boot 中的JPA,但又与JPA不一样,只能说通过一定的语法来代替SQL语法。

例子

如果你是通过看文档过来的,那你估计可能看得懂,但是不知道基本的流程。如果做比喻的话可能就是只教你做饭,不教你点火,但是你都会做饭,她不告诉你要让你炒什么菜,基本上就是这个意思,本文将会告诉你如何点火,但是基本的做菜知识你还是需要对照“菜谱进行”。

模型

如果你要用Eloquent ORM,首先你需要有一个模型,之后在有一个控制器,就行了。其中模型来定义数据库表以及字段,之后你可以通过数据库映射的方式来建立表,本文通过列举User模型进行测试:

Eloquent ORM所需要的模型我们可以理解为用于操作数据库的一道过程,在模型中你可以定义需要连接的数据库以及表等相关的信息。当然Laravel还为我们提供了多表操作的方式来满足不同环境的需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
use Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];

/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];

/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}

控制器

控制器就是你可以来对此进行CURD的一系列操作,Laravel Eloquent ORM也支持你进行一系列的Curd操作,本文我们会使用User模型来进行数据库插入的操作(首先你要引入模型use App\User;),模型默认在app\目录下,当然你也可以选择使用模型来实现控制器的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$user = new User();
$user->name='test_name';
$user->email='test_email';
$user->password='test_password';
$user->save();
}

在此之前你要确保已经配置好数据库和映射数据库等操作完善且正常,否则将无法进行下一步操作。

当以上步骤完成之后,你可以在当前项目下执行php artisan migrate来将数据库迁移到本地数据库内。此时你会产生疑惑,数据库表是从那里来的?答案是在database/migrations目录下的create_user_table.php、create_password_resets.php、create_ailed_jobes_table.php类定义的。

web

1
Route::get('/input/test', 'PostController@create');


此时当你访问http://127.0.0.1:8000/input/test的时候,已经将在控制器所定义的信息插入到了你的数据库之中。

自定义

模型


在本文中,我们可以通过使用php artisan make:model Tesst来定义一个Laravel模型,最终定义完模型之后将会生成在app目录下,我们可以让模型与数据库进行关联,其中可分为两大部分,分别为:

  1. 库:如果当前项目或个人有多个数据库之间对操作我们可以定义多个数据库且指定数据库进行操作;
  2. 表:定义完库之后我们自然就需要来定义表,一个数据库中可能存在多个表所以我们需要来指定一个表进行操作。

Tesst.php

数据表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tesst extends Model
{
/*
* @var string
* $table 指定数据库表
*/
protected $table = 'users';
}

在默认对情况下我们并没有设置Tesst模型到底使用那些表以及那些数据库,所以我们需要明确对指定数据库以及数据表来进行下一步的操作。

数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tesst extends Model
{
/*
* @var string
* $connection 指定 config/databases.php下所定义的数据库链接名称
* $table 指定数据库表
*/
protected $connection = 'mysql';
protected $table = 'users';
}

在默认对情况下,Eloquent模型将会使用其config/databases.php或.env所定义的数据库表,如果有需要我们可以定义多个数据库连接和表,之后在模型中进行指定链接:

config/databases.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'test'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'toor'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
模型名称约定
蛇型命名方法

蛇型命名方法是Python以及php和一些开发语言之中常用对命名方式之一,其在Laravel也可在很多地方见到如:'host' => env('DB_HOST', '127.0.0.1'),,其中DB_HOST就属于蛇型命名方式。

驼峰命名方式

驼峰命名方式在Laravel并不常见,如果读者有接触过Spring boot Data JPA就非常了解驼峰对命名格式TestHost

控制器

PostController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

namespace App\Http\Controllers;
use App\Tesst;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$Tessts = new Tesst();
$Tessts->name='test_namess';
$Tessts->email='test_emailss';
$Tessts->password='test_passwordss';
$Tessts->save();
}

CURD

插入

PostController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

namespace App\Http\Controllers;
use App\Tesst;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$Tessts = new Tesst();
$Tessts->name= $request->input('user');
$Tessts->email= $request->input('email');
$Tessts->password= $request->input('password');
$Tessts->save();
}
input.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<form action="/input/test" method="post">
@csrf
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
User:<input type="text" name="user" />&nbsp;
Email:<input type="text" name="email" />
Password:<input type="text" name="password" />

<input type="submit" value="up">
</form>
</body>
</html>

web.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
use Illuminate\Http\Request;

Route::get('/', function () {
return view('welcome');
});

Route::get('/input', function () {
return view(('input'));
});

Route::post('/input/test', 'PostController@create');
删除

PostController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace App\Http\Controllers;
use App\Tesst;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$Tessts = new Tesst();
Tesst::find($request->input('id'))->delete();//按主键删除
$Tessts->forceDelete();
}
input.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<form action="/input/test" method="post">
@csrf
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
Id:<input type="text" name="id" />&nbsp;
<input type="submit" value="up">
</form>
</body>
</html>

在Laravel的官方文档之中,关于删除有两种写法,分别为通过主键删除和软删除两种,本文所使用的是通过主键“id”进行删除,当然你也可以选择软删除。

关于软删除本文将不会进行列举,软删除和通过主键删除唯一不同的则是当你使用软删除的时候不会真的在数据库中删除数据,而是在模型中设置一个deleted_at对属性插入数据库,如果模型中有一个非空的delete_at值,那么说明该模型已经被软删除了。

修改

PostController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

namespace App\Http\Controllers;
use App\Tesst;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$Tessts = Tesst::find($request->input('id'));
$Tessts->name=$request->input('name');
$Tessts->save();
}
input.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<form action="/input/test" method="post">
@csrf
<input type="hidden" name="_token" value="<?php echo csrf_token()?>">
Id:<input type="text" name="id" />&nbsp;
Name:<input type="text" name="name" />
<input type="submit" value="up">
</form>
</body>
</html>

查询

PostController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

namespace App\Http\Controllers;
use App\Tesst;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;

class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$Tessts = Tesst::all();
return view('input',['Tessts'=>$Tessts]);
}
input.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<title>This is be Input up</title>
</head>
<body>
<table border="1">
<tr>
<td>Id</td>
</tr>
@foreach ($Tessts as $flight)
<tr>
<td>{{$flight->name}}</td>
</tr>
@endforeach
</table>
</body>
</html>

web.php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/input/test', 'PostController@create');

在以上对实例之中,关于PostController.php类来实现增删改查对操作方法处写的并不对,关于CURD增删改查Laravel框架可生成一个CURD模板来规定删除写在……方法下、查询写在……方法下、创建写在……方法下、更新写在……方法下。我们可以通过使用php artisan make:controller PostController --resource来创建一个CURD增删改查的模板。

⬅️ Go back