## 模型
現在我們已經了解了如何使用遷移類創建新的數據庫表,現在讓我們使用 `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` 的使用。