0

0

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

王林

王林

发布时间:2023-09-03 18:57:09

|

1371人浏览过

|

来源于php中文网

原创

在没有 laravel 的 php 应用程序中使用 illuminate database 和 eloquent

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

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

项目依赖项

  • PHP 5.5+
  • MySQL
  • 作曲家

应用功能

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

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

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

立即学习PHP免费学习笔记(深入)”;

在主项目目录中,我们将创建一个 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 文件,如以下代码片段所示。请注意,这些值应替换为您自己的连接详细信息。


接下来,让我们为我们的应用创建一个架构。

在为数据库中的表创建架构之前需要注意的一件事是,我们可以向架构添加时间戳。

如果我们想在特定表或模型上启用时间戳操作,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 文件并添加以下内容。

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 文件。


问题模型

让我们创建包含以下内容的 eloquent/app/models/Question.php 文件。


Answer 模型

让我们创建包含以下内容的 eloquent/app/models/Answer.php 文件。


Upvote 模型

让我们创建包含以下内容的 eloquent/app/models/Upvote.php 文件。


这就是设置模型类的过程。

创建前端控制器文件

在本节中,我们将创建核心引导程序和前端控制器文件。

bootstrap.php 文件

这是一个通用文件,用于引导我们的应用程序。让我们在应用程序的根目录中创建 bootstrap.php 文件。


我们还通过实例化 Database 类来设置数据库连接。

index.php 文件

这是我们应用程序的前端控制器,因此基本上它是我们应用程序的入口点。

让我们在应用程序的根目录中创建 index.php 文件。


事实上,我们将使用 index.php 文件来测试本文其余部分中的所有用例。

现在,我们也建立了模型。从下一节开始,我们将开始测试我们的用例。

任务 1:添加用户

首先,让我们创建包含以下内容的 eloquent/app/controllers/Users.php 控制器文件。

$username,'email'=>$email,'password'=>$password]);
        return $user;
    }
}
?>

在我们的 Users 控制器类中,我们创建了 create_user 方法,该方法用于创建新用户。我们使用 Eloquent 模型的 create 方法来创建一个新用户。

让我们从 index.php 文件中调用它来测试它,如以下代码片段所示。请确保在实际存储密码之前对密码进行严格加密。永远不建议在数据库中存储纯文本密码。


运行index.php文件后,它应该在users表中创建一个新用户。

任务 2:添加问题

首先,让我们创建包含以下内容的 eloquent/app/controllers/Questions.php 控制器文件。

$question,'user_id'=>$user_id]);
        return $question;
    }
}
?>

在我们的 Questions 控制器类中,我们创建了 create_question 方法,该方法用于创建新问题。我们使用 Eloquent 模型的 create 方法来创建一个新问题。

让我们从 index.php 文件中调用它来测试它,如以下代码片段所示。


运行 index.php 文件后,它应该在 questions 表中创建一个新问题。

千博购物系统.Net
千博购物系统.Net

千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使

下载

任务 3:添加问题答案

在本部分中,我们将了解如何添加问题的答案。

首先,让我们创建包含以下内容的 eloquent/app/controllers/Answers.php 控制器文件。

$answer,'question_id'=>$question_id,'user_id'=>$user_id]);
        return $answer;
    }
}
?>

在我们的 Answers 控制器类中,我们创建了 add_answer 方法,该方法用于创建新答案。

让我们从 index.php 文件中调用它来测试它,如以下代码片段所示。


运行 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 文件中调用它来测试它,如以下代码片段所示。


任务 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 文件对其进行测试,如以下代码片段所示。


您可以使用 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 文件对其进行测试,如以下代码片段所示。


任务 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 文件对其进行测试,如以下代码片段所示。


我们可以打印 $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 文件对其进行测试,如以下代码片段所示。


它返回 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 文件对其进行测试,如以下代码片段所示。


如果更新成功,则返回一个布尔值 - true。

任务 10:删除问题(软删除)

最后,我们将实现 Eloquent SoftDelete 功能。

首先,让我们使用以下语句在 Question 模型中导入 Illuminate\Database\Eloquent\SoftDeletes 特征。

use Illuminate\Database\Eloquent\SoftDeletes;

导入后我们就可以这样使用了。

use SoftDeletes;

最后,让我们将 deleted_at 添加到模型的 受保护的 $dates 属性中。这些是必需的步骤。

protected $dates = ['deleted_at'];

我们的问题模型现在看起来像这样:

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 文件对其进行测试,如以下代码片段所示。


恭喜!您刚刚使用 Illuminate 和 Eloquent 构建了一个功能齐全的后端。而且我们不需要编写那么多代码来实现这一切。

结论

Illuminate 还附带查询生成器,您可以使用它进行更复杂的数据库查询,并且绝对是您想要在应用程序中试验和使用的东西。

独立的 Illuminate 数据库中唯一缺少的是数据库迁移,这是 Laravel 的一个可爱功能,以及 Laravel 的微框架 Lumen。您应该考虑在您的应用中同时使用这两者,以利用它们附带的有用功能。

您可以在官方 Eloquent 文档页面上找到有关 Eloquent 的更多信息。

参考文献

  • GitHub 上的 Illuminate 数据库
  • 雄辩的 ORM 文档

本文已根据 Sajal Soni 的贡献进行了更新。 Sajal 来自印度,他喜欢花时间创建基于开源框架的网站。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

11

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

13

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

93

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

112

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

155

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号