在当今快节奏、不断发展的网络开发环境中,Laravel 是一种流行的 PHP 框架,用于构建现代、动态的网络应用程序。Laravel Eloquent 是它的核心功能之一,它是一个对象关系映射器 (ORM),能让开发人员高效地在数据库上执行创建、读取、更新和删除 (CRUD) 操作。
本教程演示了如何使用 Laravel 的 Eloquent ORM 在 Laravel 应用程序中执行这些操作,以及如何使用服务器部署 Laravel CRUD 应用程序。
Laravel中的CRUD功能
CRUD 操作是任何数据库驱动应用程序的支柱。它们允许您执行最基本、最重要的数据库操作,如创建新记录、读取现有记录、更新和删除记录。这些操作对于任何与数据库交互的 Laravel 应用程序的功能都至关重要。
Eloquent 提供了一种简单直观的数据库交互方式,减少了数据库管理的复杂性,让你可以专注于构建应用程序。它内置的方法和类可以让你轻松地对数据库中的记录进行 CRUD。
前提条件
要学习本教程,请确保您具备以下条件:
- XAMPP
- Composer
- A MyKinsta account
- 在 GitHub、GitLab 或 Bitbucket 上开设账户,用于推送代码
- Bootstrap version 5
步骤
- 安装 Laravel 并创建新应用程序
- 创建数据库
- 创建表格
- 创建控制器
- 设置模型
- 添加路由
- 生成 Blade 文件
- 部署和测试 CRUD 应用程序
如需获得指导,请查看教程的完整代码。
安装Laravel并创建新应用程序
打开要创建 Laravel 应用程序的终端,然后按照以下步骤操作。
- 要安装 Laravel,请运行:
composer global require laravel/installer
- 要创建一个新的 Laravel 应用程序,请运行:
laravel new crudposts
创建数据库
为应用程序创建新数据库:
- 在 XAMPP 控制面板中启动 Apache 和 MySQL 服务器,并在浏览器中访问
http://localhost/phpmyadmin
。
- 单击左侧边栏上的 “New“,创建数据库表单。您将看到以下内容:
- 添加数据库名称,然后单击 Create。
- 编辑 Laravel 应用程序根目录下的 .env 文件。该文件包含应用程序使用的所有环境变量。找到以
DB_
为前缀的变量,并用你的数据库凭据编辑它们:
DB_CONNECTION= DB_HOST= DB_PORT= DB_DATABASE= DB_USERNAME= DB_PASSWORD=
创建表
应用程序中的数据行存储在表中。本应用程序只需要一个使用 Laravel 迁移创建的表。
- 要使用 Laravel 的命令行界面 Artisan 创建表格并生成迁移文件,请运行:
php artisan make:migration create_posts_table
上述命令将在database/migrations创建一个新文件yyyy_mm_dd_hhmmss_create_posts_table.php.
- 打开 yyyy_mm_dd_hhhmmss_create_posts_table.php,在 up 函数中定义数据库表中需要的列:
public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->string('title'); $table->text('body'); $table->timestamps(); }); }
这段代码定义了帖子表的内容。它有四列: id
, title
, body
, 和 timestamps
。
- 运行database/migrations中的迁移文件,在数据库中创建表格:
php artisan migrate
运行迁移,输出结果如下:
- 转到之前创建的数据库,确认已创建表格:
创建控制器
控制器包含从数据库对帖子进行 CRUD 的所有功能。
使用 Artisan 在 Laravel 应用程序中生成控制器文件:
php artisan make:controller PostController --api
运行此命令可在 app/Http/Controllers 中创建 PostController.php 文件,其中包含模板代码和空函数声明 index、store、show、update 和 destroy。
创建函数
接下来,创建用于存储、索引、更新、销毁、创建、显示和编辑数据的函数。
您可以将它们添加到下图所示的 app/Http/Controller/PostController.php 文件中。
store
函数
store
功能将帖子添加到数据库中。
滚动到 store
函数,在空的大括号内添加以下代码:
$request->validate([ 'title' => 'required|max:255', 'body' => 'required', ]); Post::create($request->all()); return redirect()->route('posts.index') ->with('success','Post created successfully.');
这段代码获取一个包含帖子标题和正文的对象,验证数据,如果数据有效,则在数据库中添加一个新帖子,并将用户重定向到主页,同时给出一条成功信息。
index
函数
index
函数从数据库中获取所有帖子,并将数据发送到 posts.index 页面。
update
函数
update
函数包含要更新的帖子 id
、新帖子 title
和 body
。验证数据后,它会查找具有相同 id
的帖子。如果找到, update
函数就会在数据库中用新 title
和 body
更新帖子。然后,它会将用户重定向到主页,并提示成功。
destroy
函数
destroy
函数查找具有给定 id
的帖子,并将其从数据库中删除,然后将用户重定向到主页,并给出成功消息。
上述函数是用于从数据库中对帖子进行 CRUD 的函数。不过,您必须在控制器中定义更多函数,以便在 resources/views/posts/ 中呈现必要的页面。
create
函数
create
函数渲染 resources/views/posts/create.blade.php 页面,该页面包含向数据库添加帖子的表单。
show
函数
show
函数会在数据库中找到带有给定 id
的帖子,并在 resources/views/posts/show.blade.php 文件中显示该帖子。
edit
函数
edit
函数会在数据库中找到带有给定 id
的帖子,并在表单中显示带有帖子详细信息的 resources/views/posts/edit.blade.php 文件。
设置模型
Post
模型与数据库中的 posts 表交互。
- 要使用 Artisan 创建模型,请运行
php artisan make:model Post
这段代码会在 App/Models 文件夹中创建一个 Post.php 文件。
- 创建一个
fillable
数组(可填充数组)。在Post
类中的use HasFactory;
行下面添加以下代码:
protected $fillable = [ 'title', 'body', ];
这段代码创建了一个 fillable
数组,允许你在 Laravel 应用程序中向数据库添加项目。
- like:将
Post
模型连接到 PostController.php 文件。打开 PostController.php,在use Illuminate\Http\Request;
下添加下面一行。看起来像这样
use Illuminate\Http\Request; use App\Models\Post;
现在,PostController.php 文件应该是这样的:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Post; class PostController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $posts = Post::all(); return view('posts.index', compact('posts')); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $request->validate([ 'title' => 'required|max:255', 'body' => 'required', ]); Post::create($request->all()); return redirect()->route('posts.index') ->with('success', 'Post created successfully.'); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { $request->validate([ 'title' => 'required|max:255', 'body' => 'required', ]); $post = Post::find($id); $post->update($request->all()); return redirect()->route('posts.index') ->with('success', 'Post updated successfully.'); } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { $post = Post::find($id); $post->delete(); return redirect()->route('posts.index') ->with('success', 'Post deleted successfully'); } // routes functions /** * Show the form for creating a new post. * * @return \Illuminate\Http\Response */ public function create() { return view('posts.create'); } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { $post = Post::find($id); return view('posts.show', compact('post')); } /** * Show the form for editing the specified post. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { $post = Post::find($id); return view('posts.edit', compact('post')); } }
添加路由
创建控制器函数和 Post
模型后,必须为控制器函数添加路由。
- 打开 routes/web.php,删除应用程序生成的模板路由。用下面的代码替换,将控制器函数连接到各自的路由:
// returns the home page with all posts Route::get('/', PostController::class .'@index')->name('posts.index'); // returns the form for adding a post Route::get('/posts/create', PostController::class . '@create')->name('posts.create'); // adds a post to the database Route::post('/posts', PostController::class .'@store')->name('posts.store'); // returns a page that shows a full post Route::get('/posts/{post}', PostController::class .'@show')->name('posts.show'); // returns the form for editing a post Route::get('/posts/{post}/edit', PostController::class .'@edit')->name('posts.edit'); // updates a post Route::put('/posts/{post}', PostController::class .'@update')->name('posts.update'); // deletes a post Route::delete('/posts/{post}', PostController::class .'@destroy')->name('posts.destroy');
- 要连接路由,请打开 app/Http/Controllers/PostController.php,在
use Illuminate\Support\Facades\Route;
行下添加下面一行:
use Illuminate\Support\Facades\Route; use App\Http\Controllers\PostController;
routes/web.php 文件现在应该是这样的:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\PostController; // returns the home page with all posts Route::get('/', PostController::class .'@index')->name('posts.index'); // returns the form for adding a post Route::get('/posts/create', PostController::class . '@create')->name('posts.create'); // adds a post to the database Route::post('/posts', PostController::class .'@store')->name('posts.store'); // returns a page that shows a full post Route::get('/posts/{post}', PostController::class .'@show')->name('posts.show'); // returns the form for editing a post Route::get('/posts/{post}/edit', PostController::class .'@edit')->name('posts.edit'); // updates a post Route::put('/posts/{post}', PostController::class .'@update')->name('posts.update'); // deletes a post Route::delete('/posts/{post}', PostController::class .'@destroy')->name('posts.destroy');
生成Blade文件
有了路由之后,就可以创建 Laravel Blade 文件了。在使用 Artisan 生成 Blade 文件之前,先创建 make:view
命令,用它来生成 blade.php 文件。
- 在 CLI 中运行以下代码,在 app/Console/Commands 文件夹中创建 MakeViewCommand 命令文件:
php artisan make:command MakeViewCommand
- 用下面的代码替换 MakeViewCommand 文件中的代码,创建一条从 CLI 生成 .blade.php 文件的命令:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use File; class MakeViewCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'make:view {view}'; /** * The console command description. * * @var string */ protected $description = 'Create a new blade template.'; /** * Execute the console command. * * @return mixed */ public function handle() { $view = $this->argument('view'); $path = $this->viewPath($view); $this->createDir($path); if (File::exists($path)) { $this->error("File {$path} already exists!"); return; } File::put($path, $path); $this->info("File {$path} created."); } /** * Get the view full path. * * @param string $view * * @return string */ public function viewPath($view) { $view = str_replace('.', '/', $view) . '.blade.php'; $path = "resources/views/{$view}"; return $path; } /** * Create a view directory if it does not exist. * * @param $path */ public function createDir($path) { $dir = dirname($path); if (!file_exists($dir)) { mkdir($dir, 0777, true); } } }
创建主页
接下来,创建您的主页。主页是 index.blade.php 文件,其中列出了所有帖子。
- 要创建主页,请运行:
php artisan make:view posts.index
这会在 /resources/views 文件夹内创建 posts 文件夹,并在其下创建 index.blade.php 文件。结果路径为 /resources/views/posts/index.blade.php。
- 在 index.blade.php 文件中添加以下代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"> <title>Posts</title> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-warning"> <div class="container-fluid"> <a class="navbar-brand h1" href={{ route('posts.index') }}>CRUDPosts</a> <div class="justify-end "> <div class="col "> <a class="btn btn-sm btn-success" href={{ route('posts.create') }}>Add Post</a> </div> </div> </div> </nav> <div class="container mt-5"> <div class="row"> @foreach ($posts as $post) <div class="col-sm"> <div class="card"> <div class="card-header"> <h5 class="card-title">{{ $post->title }}</h5> </div> <div class="card-body"> <p class="card-text">{{ $post->body }}</p> </div> <div class="card-footer"> <div class="row"> <div class="col-sm"> <a href="{{ route('posts.edit', $post->id) }}" class="btn btn-primary btn-sm">Edit</a> </div> <div class="col-sm"> <form action="{{ route('posts.destroy', $post->id) }}" method="post"> @csrf @method('DELETE') <button type="submit" class="btn btn-danger btn-sm">Delete</button> </form> </div> </div> </div> </div> </div> @endforeach </div> </div> </body> </html>
上面的代码使用 Bootstrap 创建了一个简单的 HTML 页面。该页面使用 @foreach
Blade 助手创建了一个导航栏和一个网格模板,其中列出了数据库中所有帖子的详细信息和两个操作按钮–编辑和删除。
Edit 按钮会将用户带入 “Edit post” 页面,用户可以在这里编辑帖子。Delete 按钮使用 {{ route('posts.destroy', $post->id) }}
这个 DELETE
方法从数据库中删除帖子。
注:所有文件的导航条代码与前一个文件相同。
- 创建 create.blade.php 页面。名为 create 的 Blade 文件会将帖子添加到数据库中。使用以下命令生成该文件:
php artisan make:view posts.create
这会在 /resources/views/posts 文件夹中生成 create.blade.php 文件。
- 在 create.blade.php 文件中添加以下代码:
// same as the previous file. Add the following after the nav tag and before the closing body tag. <div class="container h-100 mt-5"> <div class="row h-100 justify-content-center align-items-center"> <div class="col-10 col-md-8 col-lg-6"> <h3>Add a Post</h3> <form action="{{ route('posts.store') }}" method="post"> @csrf <div class="form-group"> <label for="title">Title</label> <input type="text" class="form-control" id="title" name="title" required> </div> <div class="form-group"> <label for="body">Body</label> <textarea class="form-control" id="body" name="body" rows="3" required></textarea> </div> <br> <button type="submit" class="btn btn-primary">Create Post</button> </form> </div> </div> </div>
上面的代码创建了一个带有 title
和 body
字段的表单,以及一个 submit
按钮,用于通过 {{ route('posts.store') }}
操作和 POST
方法向数据库添加帖子。
- 创建 Edit post 页面,以编辑数据库中的帖子。使用以下命令生成文件:
php artisan make:view posts.edit
这会在 /resources/views/posts 文件夹中创建 edit.blade.php 文件。
- 在 edit.blade.php 文件中添加以下代码:
<div class="container h-100 mt-5"> <div class="row h-100 justify-content-center align-items-center"> <div class="col-10 col-md-8 col-lg-6"> <h3>Update Post</h3> <form action="{{ route('posts.update', $post->id) }}" method="post"> @csrf @method('PUT') <div class="form-group"> <label for="title">Title</label> <input type="text" class="form-control" id="title" name="title" value="{{ $post->title }}" required> </div> <div class="form-group"> <label for="body">Body</label> <textarea class="form-control" id="body" name="body" rows="3" required>{{ $post->body }}</textarea> </div> <button type="submit" class="btn mt-3 btn-primary">Update Post</button> </form> </div> </div> </div>
上面的代码创建了一个带有 title
和 body
字段的表单,以及一个提交按钮,用于通过 {{ route('posts.update') }}
操作和 PUT
方法编辑数据库中指定 id
的帖子。
- 然后,使用下面的代码重启应用服务器:
php artisan serve
在浏览器上访问 http://127.0.0.1:8000
,查看新博客。单击 “Add Post” 按钮添加新帖子。
部署和测试CRUD应用程序
为部署应用程序做如下准备
- 通过声明公共文件夹,使部署工作顺利进行。在应用程序文件夹根目录下添加一个 .htaccess 文件,其中包含以下代码:
<IfModule mod_rewrite.c > RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule >
- 在 routes/web.php 文件中的路由上方添加以下代码,强制应用程序使用
HTTPS
:
use Illuminate\Support\Facades\URL; URL::forceScheme('https');
- 将代码推送到 Git 仓库。Kinsta 支持从 GitHub、GitLab 或 Bitbucket 进行部署。
在 MyKinsta 上建立项目
- 如果您还没有 MyKinsta 账户,请创建一个。
- 登录账户,单击控制面板上的 Add Service 按钮创建新应用程序。
- 如果您是新用户,请连接到您的 GitHub、GitLab 或 Bitbucket 账户,并赋予特定权限。
- 填写表格并添加
APP_KEY
。你可以在 .env 文件中找到相应的值。
- 选择构建资源,以及是使用应用程序构建路径还是使用 Dockerfile 构建应用程序。在本演示中,让 MyKinsta 根据你的版本库构建应用程序。
- 指定部署过程中要运行的不同进程。此时可以留空。
- 最后,添加您的付款方式。
确认付款方式后,MyKinsta 将部署您的应用程序并为您分配一个 URL,如下所示:
成功部署。
您可以访问该链接,但会出现 500 | Server Error
页面,因为应用程序需要有效的数据库连接才能运行。下面的部分将解决这个问题。
通过 MyKinsta 创建数据库
- 要创建数据库,请转到 MyKinsta 面板并单击 Add Service。
- 选择 Database 并填写表格,输入首选数据库名称、类型、用户名和密码。添加数据中心位置和适合您应用程序的数据库大小。
- 下一页显示费用摘要和您的付款方式。单击 “Create Database” 完成创建过程。
- 创建数据库后,MyKinsta 会将您重定向到服务列表。单击刚刚创建的数据库,向下滚动到 External Connections。复制数据库凭证。
- 返回应用程序的 “Deployment” 页面并单击 “Settings“。然后向下滚动到 Environment Variables,单击 Add Environment Variables。按以下顺序将数据库凭据添加为环境变量:
DB_CONNECTION=mysql DB_HOST=External hostname DB_PORT=External port DB_DATABASE=Database name DB_USERNAME=Username DB_PASSWORD=Password
应用程序环境变量列表现在应该如下所示:
.env 变量列表。
- 转到应用程序的 “Deployments” 页面,单击 “Deploy Now” 手动部署应用程序,以应用这些更改。到目前为止,您已经创建了一个数据库并将其连接到了应用程序。
- 最后,要在 MyKinsta 数据库中创建数据库表,请使用在 MyKinsta 应用程序中输入的相同凭据更新 .env 文件,并运行以下命令将数据库连接到本地应用程序:
php artisan migrate
此命令运行所有迁移文件。它会在 MyKinsta 应用程序中创建所有已定义的表。
现在,您可以使用首次部署后分配的 URL 测试应用程序。
小结
Laravel 是一个全面的框架,可用于创建需要 CRUD 功能的健壮、可扩展的网络应用程序。凭借直观的语法和强大的功能,Laravel 可以轻松地在应用程序中构建 CRUD 操作。
本文介绍了 CRUD 操作的基本概念,以及如何使用 Laravel 的内置功能实现它们。它还解释了:
- 如何在 MyKinsta 中创建数据库并将其连接到应用程序
- 如何使用 Laravel 的迁移功能来定义数据库表、创建控制器文件及其函数
- 定义模型并将其连接到控制器。通过 Laravel 的路由生成 Blade 文件,创建相应的页面和表单,并使用 MyKinsta 部署和测试应用程序。
评论留言