Home >Backend Development >PHP Tutorial >Using Illuminate Database and Eloquent in a PHP application without Laravel
Illuminate 是 Laravel 的数据库引擎,减去了 Laravel。它与 Laravel 中的 Eloquent ORM 捆绑在一起。如果您想使用 ORM 构建 PHP 应用程序并且不想使用 Laravel,那么本教程适合您。
在本教程中,我们将使用 PHP、Illuminate Database 和 Eloquent ORM 构建问答应用程序的后端。
我们的应用程序将执行以下任务:
首先,让我们创建项目目录和结构。在本教程的其余部分中,我假设 eloquent 是我们的项目根目录名称。
在主项目目录中,我们将创建一个 app文件夹,然后在这个app文件夹中,我们将创建两个文件夹:模型和控制器。 在这张图中,我们的主项目文件夹名为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;
现在我们已经完成了数据库设置。接下来,我们将创建应用程序所需的模型文件。
首先,我们需要创建一个通用的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 文件。
<?php require './config.php'; require './vendor/autoload.php'; use Models\Database; // initialize Illuminate database connection new Database(); ?>
我们还通过实例化 Database
类来设置数据库连接。
这是我们应用程序的前端控制器,因此基本上它是我们应用程序的入口点。
让我们在应用程序的根目录中创建 index.php 文件。
<?php require 'bootstrap.php'; // our example code goes here... ?>
事实上,我们将使用 index.php 文件来测试本文其余部分中的所有用例。
现在,我们也建立了模型。从下一节开始,我们将开始测试我们的用例。
首先,让我们创建包含以下内容的 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
表中创建一个新用户。
首先,让我们创建包含以下内容的 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
表中创建一个新问题。
在本部分中,我们将了解如何添加问题的答案。
首先,让我们创建包含以下内容的 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
表中创建一个新答案。
这些步骤与我们之前执行的步骤几乎相同。
让我们在 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); ?>
对于这样的任务,我们可以使用 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
变量以查看结果。
这将是一对一的关系,因为一个问题有一个用户,所以让我们将以下方法添加到 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(); ?>
首先,我们定义答案和点赞之间的关系。一个答案有很多赞成票,因此关系是一对多。
让我们将以下函数添加到我们的 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
变量来查看结果。
首先,我们在 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
的用户添加的问题数。
使用 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。
最后,我们将实现 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。您应该考虑在您的应用中同时使用这两者,以利用它们附带的有用功能。
You can find more information about Eloquent on the official Eloquent documentation page.
This article has been updated with a contribution from Sajal Soni. Sajal is from India and enjoys spending his time creating websites based on open source frameworks.
The above is the detailed content of Using Illuminate Database and Eloquent in a PHP application without Laravel. For more information, please follow other related articles on the PHP Chinese website!