Illuminate 是 Laravel 的数据库引擎,减去了 Laravel。它与 Laravel 中的 Eloquent ORM 捆绑在一起。如果您想使用 ORM 构建 PHP 应用程序并且不想使用 Laravel,那么本教程适合您。
在本教程中,我们将使用 PHP、Illuminate Database 和 Eloquent ORM 构建问答应用程序的后端。
项目依赖项
- PHP 5.5+
- MySQL
- 作曲家
应用功能
我们的应用程序将执行以下任务:
- 添加用户
- 添加问题
- 添加问题的答案
- 对答案投赞成票
- 获取问题及答案
- 获取所有问题以及提出问题的用户
- 获取特定问题、答案和点赞
- 统计特定用户的问题
- 更新用户的答案
- 删除问题
首先,让我们创建项目目录和结构。在本教程的其余部分中,我假设 eloquent 是我们的项目根目录名称。
在主项目目录中,我们将创建一个 app文件夹,然后在这个app文件夹中,我们将创建两个文件夹:模型和控制器。 在这张图中,我们的主项目文件夹名为eloquent。您应该将其替换为您喜欢的任何名称。
安装 Eloquent 库
接下来,让我们为我们的项目安装依赖项。在主项目文件夹中,我们创建 eloquent/composer.json 文件。创建后,将以下代码粘贴到我们的 eloquent/composer.json 文件中。
{ "name": "illuminate-example/eloquent", "description": "Implementation of Database Queries with illuminate and Eloquent", "type": "project", "require": {} }
要安装 Illuminate 数据库库,我们需要将 “Illuminate/database”: “^7.30”,
添加到我们的 eloquent/composer.json强>文件。
接下来,让我们为我们的模型和控制器添加 PSR-4 自动加载:
"autoload": { "psr-4": { "Controllers//": "app/controllers/", "Models//": "app/models/" } }
现在,我们的 eloquent/composer.json 文件应如下所示:
{ "name": "illuminate-example/eloquent", "description": "Implementation of Database Queries with illuminate and Eloquent", "type": "project", "require": { "illuminate/database": "^7.30" }, "autoload": { "psr-4": { "Controllers//": "app/controllers/", "Models//": "app/models/" } } }
最后,让我们在项目目录的根目录中运行以下两个命令。
$composer install $composer dump-autoload -o
设置数据库表和配置文件
让我们为数据库凭据添加一个配置文件。在主项目目录中,我们创建一个名为 eloquent/config.php 的文件,并在 eloquent/config 中定义数据库详细信息。 php 文件,如以下代码片段所示。请注意,这些值应替换为您自己的连接详细信息。
<?php defined('DBDRIVER') or define('DBDRIVER','mysql'); defined('DBHOST') or define('DBHOST','localhost'); defined('DBNAME') or define('DBNAME','eloquent-app'); defined('DBUSER') or define('DBUSER','root'); defined('DBPASS') or define('DBPASS','pass'); ?>
接下来,让我们为我们的应用创建一个架构。
在为数据库中的表创建架构之前需要注意的一件事是,我们可以向架构添加时间戳。
如果我们想在特定表或模型上启用时间戳操作,Eloquent ORM 需要两个时间戳列。它们是 created_at
和 updated_at
列。如果我们为模型启用时间戳,Eloquent 会自动使用我们创建或更新记录的时间更新这些字段。
第三列名为 deleted_at
。不过, deleted_at
时间戳的工作方式有所不同。 Eloquent 具有软删除功能,它使用 deleted_at
列来确定记录是否已被删除。如果您使用 eloquent delete
函数删除一条记录并启用软删除,则该列将根据删除时间进行更新。这些删除的项目可以随时检索。
在此应用中,我们将利用时间戳,因此我们将在架构创建中使用所有三个时间戳。
让我们在 MySQL 中使用以下命令创建表。
问题
让我们使用以下 SQL 语句在数据库中创建 questions
表。
CREATE TABLE `questions` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `question` tinytext, `user_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
答案
让我们使用以下 SQL 语句在数据库中创建 answers
表。
CREATE TABLE `answers` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `answer` tinytext, `user_id` int(11) DEFAULT NULL, `question_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
投票
让我们使用以下 SQL 语句在数据库中创建 upvotes
表。
CREATE TABLE `upvotes` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `answer_id` int(11) DEFAULT NULL, `user_id` int(11) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
用户
让我们使用以下 SQL 语句在数据库中创建 users
表。
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `email` varchar(200) DEFAULT NULL, `password` varchar(200) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
现在我们已经完成了数据库设置。接下来,我们将创建应用程序所需的模型文件。
设置 Eloquent 模型
首先,我们需要创建一个通用的Database
类,用于设置数据库连接。
数据库
类
使用您喜欢的文本编辑器创建 eloquent/app/models/database.php 文件并添加以下内容。
<?php namespace Models; use Illuminate/Database/Capsule/Manager as Capsule; class Database { public function __construct() { $capsule = new Capsule; $capsule->addConnection([ 'driver' => DBDRIVER, 'host' => DBHOST, 'database' => DBNAME, 'username' => DBUSER, 'password' => DBPASS, 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ]); // Setup the Eloquent ORM… $capsule->bootEloquent(); } }
在上面的文件中,我们初始化了 Capsule
类。接下来,我们使用 addConnection
方法创建一个新的 MySQL 连接。最后,我们使用 bootEloquent
方法来初始化 Eloquent 模型。
User
模型
让我们创建包含以下内容的 eloquent/app/models/User.php 文件。
<?php namespace Models; use /Illuminate/Database/Eloquent/Model; class User extends Model { protected $table = 'users'; protected $fillable = ['username', 'email', 'password']; } ?>
问题
模型
让我们创建包含以下内容的 eloquent/app/models/Question.php 文件。
<?php namespace Models; use /Illuminate/Database/Eloquent/Model; class Question extends Model { protected $table = 'questions'; protected $fillable = ['question','user_id']; } ?>
Answer
模型
让我们创建包含以下内容的 eloquent/app/models/Answer.php 文件。
<?php namespace Models; use /Illuminate/Database/Eloquent/Model; class Answer extends Model { protected $table = 'answers'; protected $fillable = ['answer','user_id','question_id']; } ?>
Upvote
模型
让我们创建包含以下内容的 eloquent/app/models/Upvote.php 文件。
<?php namespace Models; use /Illuminate/Database/Eloquent/Model; class Upvote extends Model { protected $table = 'upvotes'; protected $fillable = ['answer_id', 'user_id']; } ?>
这就是设置模型类的过程。
创建前端控制器文件
在本节中,我们将创建核心引导程序和前端控制器文件。
bootstrap.php 文件
这是一个通用文件,用于引导我们的应用程序。让我们在应用程序的根目录中创建 bootstrap.php 文件。
<?php require './config.php'; require './vendor/autoload.php'; use Models/Database; // initialize Illuminate database connection new Database(); ?>
我们还通过实例化 Database
类来设置数据库连接。
index.php 文件
这是我们应用程序的前端控制器,因此基本上它是我们应用程序的入口点。
让我们在应用程序的根目录中创建 index.php 文件。
<?php require 'bootstrap.php'; // our example code goes here... ?>
事实上,我们将使用 index.php 文件来测试本文其余部分中的所有用例。
现在,我们也建立了模型。从下一节开始,我们将开始测试我们的用例。
任务 1:添加用户
首先,让我们创建包含以下内容的 eloquent/app/controllers/Users.php 控制器文件。
<?php namespace Controllers; use Models/User; class Users { public static function create_user($username, $email, $password) { $user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]); return $user; } } ?>
在我们的 Users
控制器类中,我们创建了 create_user
方法,该方法用于创建新用户。我们使用 Eloquent
模型的 create
方法来创建一个新用户。
让我们从 index.php 文件中调用它来测试它,如以下代码片段所示。请确保在实际存储密码之前对密码进行严格加密。永远不建议在数据库中存储纯文本密码。
<?php require 'bootstrap.php'; use Controllers/Users; $user = Users::create_user("user1", "user1@example.com", "user1_pass"); ?>
运行index.php文件后,它应该在users
表中创建一个新用户。
任务 2:添加问题
首先,让我们创建包含以下内容的 eloquent/app/controllers/Questions.php 控制器文件。
<?php namespace Controllers; use Models/Question; class Questions{ public static function create_question($question,$user_id) { $question = Question::create(['question'=>$question,'user_id'=>$user_id]); return $question; } } ?>
在我们的 Questions
控制器类中,我们创建了 create_question
方法,该方法用于创建新问题。我们使用 Eloquent
模型的 create
方法来创建一个新问题。
让我们从 index.php 文件中调用它来测试它,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Questions; $question = Questions::create_question("Have you ever met your doppelganger?", 1); ?>
运行 index.php 文件后,它应该在 questions
表中创建一个新问题。
任务 3:添加问题答案
在本部分中,我们将了解如何添加问题的答案。
首先,让我们创建包含以下内容的 eloquent/app/controllers/Answers.php 控制器文件。
<?php namespace Controllers; use Models/Answer; class Answers { public static function add_answer($answer,$question_id,$user_id) { $answer = Answer::create(['answer'=>$answer,'question_id'=>$question_id,'user_id'=>$user_id]); return $answer; } } ?>
在我们的 Answers
控制器类中,我们创建了 add_answer
方法,该方法用于创建新答案。
让我们从 index.php 文件中调用它来测试它,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Answers; $answers = Answers::add_answer("This is an answer", 1, 2); ?>
运行 index.php 文件后,它应该在 answers
表中创建一个新答案。
任务 4:对答案进行投票
这些步骤与我们之前执行的步骤几乎相同。
让我们在 eloquent/app/controllers/Answers.php 控制器中添加以下方法。
... ... public static function upvote_answer($answer_id,$user_id) { $upvote = Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]); return $upvote; } ... ...
您还需要通过添加以下代码在 eloquent/app/controllers/Answers.php 控制器文件中导入 Upvote
模型。
use Models/Upvote;
最后,我们从 index.php 文件中调用它来测试它,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Answers; $upvote = Answers::upvote_answer(1, 14); ?>
任务 5:获取问题及答案
对于这样的任务,我们可以使用 Eloquent 关系。
关系类型包括一对一、一对多、多对多等。
使用这些关系时,Eloquent 假定模型上存在 modelname_id 形式的外键。对于此任务,关系是一对多关系,因为单个问题可以拥有任意数量的答案。
首先,让我们通过将以下函数添加到我们的 Question
模型来定义这种关系。
... ... public function answers() { return $this->hasMany('/Models/Answer'); } ... ...
之后,在 eloquent/app/controllers/Questions.php 控制器文件中,添加以下函数来获取带有答案的问题。
... ... public static function get_questions_with_answers() { $questions = Question::with('answers')->get()->toArray(); return $questions; } ... ...
它检索问题及其相应的答案。
让我们使用 index.php 文件对其进行测试,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Questions; $all = Questions::get_questions_with_answers(); ?>
您可以使用 var_dump
或 print_r
函数打印 $all
变量以查看结果。
任务 6:获取所有问题以及提出问题的用户
这将是一对一的关系,因为一个问题有一个用户,所以让我们将以下方法添加到 Question
模型中。
... ... public function user() { return $this->belongsTo('/Models/User'); } ... ...
之后,在 eloquent/app/controllers/Questions.php 控制器文件中,添加以下函数。
... ... public static function get_questions_with_users() { $questions = Question::with('user')->get()->toArray(); return $questions; } ... ...
让我们使用 index.php 文件对其进行测试,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Questions; $all_with_users = Questions::get_questions_with_users(); ?>
任务 7:获得一个问题并附上答案和点赞
首先,我们定义答案和点赞之间的关系。一个答案有很多赞成票,因此关系是一对多。
让我们将以下函数添加到我们的 Answer
模型中:
... ... public function upvotes() { return $this->hasMany('/Models/Upvote'); } ... ...
在 eloquent/app/controllers/Questions.php 控制器文件中,我们创建以下函数。
... ... public static function get_question_answers_upvotes($question_id) { $questions = Question::find($question_id)->answers()->with('upvotes')->get()->toArray(); return $questions; } ... ...
让我们使用 index.php 文件对其进行测试,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Questions; $one_question = Questions::get_question_answers_upvotes(1); ?>
我们可以打印 $one_question
变量来查看结果。
任务 8:统计特定用户的所有问题
首先,我们在 eloquent/app/controllers/Users.php 控制器中导入 Question
模型:
use Models/Question;
导入后,我们在同一个文件中添加以下函数。
... ... public static function question_count($user_id) { $count = Question::where('user_id', $user_id)->count(); return $count; } ... ...
最后,让我们使用 index.php 文件对其进行测试,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Users; $user_question_count = Users::question_count(1); ?>
它返回 ID 为 1
的用户添加的问题数。
任务 9:更新用户的答案
使用 Eloquent ORM 进行更新的概念非常简单。首先我们找到一条记录,然后我们变异并保存。
在 eloquent/app/controllers/Answers.php 控制器中,我们添加以下函数:
... ... public static function update_answer($answer_id,$new_answer) { $answer = Answer::find($answer_id); $answer->answer = $new_answer; $updated = $answer->save(); return $updated; } ... ...
最后,让我们使用 index.php 文件对其进行测试,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Answers; $update_answer = Answers::update_answer(1, "This is an updated answer"); ?>
如果更新成功,则返回一个布尔值 – true。
任务 10:删除问题(软删除)
最后,我们将实现 Eloquent SoftDelete 功能。
首先,让我们使用以下语句在 Question
模型中导入 Illuminate/Database/Eloquent/SoftDeletes
特征。
use Illuminate/Database/Eloquent/SoftDeletes;
导入后我们就可以这样使用了。
use SoftDeletes;
最后,让我们将 deleted_at
添加到模型的 受保护的 $dates
属性中。这些是必需的步骤。
protected $dates = ['deleted_at'];
我们的问题
模型现在看起来像这样:
<?php namespace Models; use /Illuminate/Database/Eloquent/Model; use Illuminate/Database/Eloquent/SoftDeletes; class Question extends Model { use SoftDeletes; protected $table = 'questions'; protected $fillable = ['question','user_id']; protected $dates = ['deleted_at']; public function answers() { return $this->hasMany('/Models/Answer'); } public function user() { return $this->belongsTo('/Models/User'); } } ?>
接下来,继续在 eloquent/app/controllers/Questions.php 控制器中创建 delete_question
方法。
... ... public static function delete_question($question_id) { $question = Question::find($question_id); $deleted = $question->delete(); return $deleted; } ... ...
最后,让我们使用 index.php 文件对其进行测试,如以下代码片段所示。
<?php require 'bootstrap.php'; use Controllers/Questions; $delete = Questions::delete_question(1); ?>
恭喜!您刚刚使用 Illuminate 和 Eloquent 构建了一个功能齐全的后端。而且我们不需要编写那么多代码来实现这一切。
结论
Illuminate 还附带查询生成器,您可以使用它进行更复杂的数据库查询,并且绝对是您想要在应用程序中试验和使用的东西。
独立的 Illuminate 数据库中唯一缺少的是数据库迁移,这是 Laravel 的一个可爱功能,以及 Laravel 的微框架 Lumen。您应该考虑在您的应用中同时使用这两者,以利用它们附带的有用功能。
您可以在官方 Eloquent 文档页面上找到有关 Eloquent 的更多信息。
参考文献
- GitHub 上的 Illuminate 数据库
- 雄辩的 ORM 文档
本文已根据 Sajal Soni 的贡献进行了更新。 Sajal 来自印度,他喜欢花时间创建基于开源框架的网站。
以上就是在没有 Laravel 的 PHP 应用程序中使用 Illuminate Database 和 Eloquent的详细内容,更多请关注php中文网其它相关文章!