## 模型
现在我们已经了解了如何使用迁移类创建新的数据库表,现在让我们使用 `Eloquent ORM` 查询该数据。`Laravel` 的` Eloquent ORM` 提供了漂亮、简洁方式来和数据库交互。每个数据库表都有一个对应的 `Model` 用来与该表交互。本节将快速了解一下基本命名空间和MVC工作流程。
### 定义模型
创建模型实例的最简单方法是使用 `Artisan` 命令 `make:model`:
```php
php artisan make:model Project
```
> 请注意,我们并没有告诉 `Eloquent`,`Project` 模型该使用哪一个数据表。除非数据表明确地指定了其它名称,否则将使用类的复数形式来作为表名。
### 使用tinker
`Tinker` 是一个 `REPL (read-eval-print-loop)`,`REPL` 指的是一个简单的、可交互式的编程环境,通过执行用户输入的命令,并将执行结果直接打印到命令行界面上来完成整个操作。
```
λ php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.11 — cli) by Justin Hileman
>>> $project = new App\Project
=> App\Project {#2899}
>>> $project->title='iwanli'
=> "iwanli"
>>> $project->description='iwanli.me'
=> "iwanli.me"
>>> $project
=> App\Project {#2899
title: "iwanli",
description: "iwanli.me",
}
>>> $project->save()
=> true
>>>
```
### 命名空间
下面我直接复制PHP官方的对命名空间的阐述:
> 什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
* 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
* 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
### MVC
`MVC`全名是`Model`、`View`、`Controller`,即模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。
* PagesController
```php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Project;
class PagesController extends Controller
{
public function home()
{
$projects = Project::all();
return view('welcome')->with(compact('projects'));
}
public function about()
{
return view('about');
}
public function news()
{
return view('news');
}
}
```
* welcome.blade.php
```
@extends('layout')
@section('title', 'Laravel')
@section('content')
<ul>
@foreach($projects as $project)
<li>{{ $project->title.'---'.$project->description }}</li>
@endforeach
</ul>
@endsection
```
### 总结
本节快速了解了一下命名空间,定义模型,MVC工作流程及 `Laravel Tinker` 的使用。