2023-09-03

在没有 Laravel 的 PHP 应用程序中使用 Illuminate Database 和 Eloquent


在没有 Laravel 的 PHP 应用程序中使用 Illuminate Database 和 Eloquent

Illuminate 是 Laravel 的数据库引擎,减去了 Laravel。它与 Laravel 中的 Eloquent ORM 捆绑在一起。如果您想使用 ORM 构建 PHP 应用程序并且不想使用 Laravel,那么本教程适合您。

在本教程中,我们将使用 PHP、Illuminate Database 和 Eloquent ORM 构建问答应用程序的后端。

项目依赖项

  • PHP 5.5+
  • MySQL
  • 作曲家

应用功能

我们的应用程序将执行以下任务:

  • 添加用户
  • 添加问题
  • 添加问题的答案
  • 对答案投赞成票
  • 获取问题及答案
  • 获取所有问题以及提出问题的用户
  • 获取特定问题、答案和点赞
  • 统计特定用户的问题
  • 更新用户的答案
  • 删除问题

首先,让我们创建项目目录和结构。在本教程的其余部分中,我假设 eloquent 是我们的项目根目录名称。

在主项目目录中,我们将创建一个 app文件夹,然后在这个app文件夹中,我们将创建两个文件夹:模型控制器在这张图中,我们的主项目文件夹名为eloquent。您应该将其替换为您喜欢的任何名称。

在没有 Laravel 的 PHP 应用程序中使用 Illuminate Database 和 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_atupdated_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_dumpprint_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中文网其它相关文章!

https://www.php.cn/faq/601532.html

发表回复

Your email address will not be published. Required fields are marked *