Using Illuminate Database and Eloquent in a PHP application without Laravel

王林
Release: 2023-09-03 18:58:02
Original
1107 people have browsed it

在没有 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。您应该将其替换为您喜欢的任何名称。

Using Illuminate Database and Eloquent in a PHP application without Laravel

安装 Eloquent 库

接下来,让我们为我们的项目安装依赖项。在主项目文件夹中,我们创建 eloquent/composer.json 文件。创建后,将以下代码粘贴到我们的 eloquent/composer.json 文件中。

{
 "name": "illuminate-example/eloquent",
 "description": "Implementation of Database Queries with illuminate and Eloquent",
 "type": "project",
 "require": {}
}
Copy after login

要安装 Illuminate 数据库库,我们需要将 “Illuminate/database”: “^7.30”, 添加到我们的 eloquent/composer.json文件。

接下来,让我们为我们的模型和控制器添加 PSR-4 自动加载:

"autoload": {
    "psr-4": {
        "Controllers\\": "app/controllers/",
        "Models\\": "app/models/" 
    }
}
Copy after login

现在,我们的 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/"
        }
    }
}
Copy after login

最后,让我们在项目目录的根目录中运行以下两个命令。

$composer install
$composer dump-autoload -o
Copy after login

设置数据库表和配置文件

让我们为数据库凭据添加一个配置文件。在主项目目录中,我们创建一个名为 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');
?>
Copy after login

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

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

如果我们想在特定表或模型上启用时间戳操作,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;
Copy after login

答案

让我们使用以下 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;
Copy after login

投票

让我们使用以下 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;
Copy after login

用户

让我们使用以下 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;
Copy after login

现在我们已经完成了数据库设置。接下来,我们将创建应用程序所需的模型文件。

设置 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();
    }
}
Copy after login

在上面的文件中,我们初始化了 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'];
}
?>
Copy after login

问题模型

让我们创建包含以下内容的 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'];
}
?>
Copy after login

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'];
}
?>
Copy after login

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'];
      
}
?>
Copy after login

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

创建前端控制器文件

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

bootstrap.php 文件

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

<?php
require './config.php';
require './vendor/autoload.php';

use Models\Database;

// initialize Illuminate database connection
new Database();
?>
Copy after login

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

index.php 文件

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

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

<?php
require 'bootstrap.php';

// our example code goes here...
?>
Copy after login

事实上,我们将使用 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;
    }
}
?>
Copy after login

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

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

<?php
require 'bootstrap.php';

use Controllers\Users; 
 
$user = Users::create_user("user1", "user1@example.com", "user1_pass");
?>
Copy after login

运行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;
    }
}
?>
Copy after login

在我们的 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);
?>
Copy after login

运行 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;
    }
}
?>
Copy after login

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

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

<?php
require 'bootstrap.php';

use Controllers\Answers; 
 
$answers = Answers::add_answer("This is an answer", 1, 2);
?>
Copy after login

运行 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;
}
...
...
Copy after login

您还需要通过添加以下代码在 eloquent/app/controllers/Answers.php 控制器文件中导入 Upvote 模型。

use Models\Upvote;
Copy after login

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

<?php
require 'bootstrap.php';

use Controllers\Answers; 
 
$upvote = Answers::upvote_answer(1, 14);
?>
Copy after login

任务 5:获取问题及答案

对于这样的任务,我们可以使用 Eloquent 关系。

关系类型包括一对一、一对多、多对多等。

使用这些关系时,Eloquent 假定模型上存在 modelname_id 形式的外键。对于此任务,关系是一对多关系,因为单个问题可以拥有任意数量的答案。

首先,让我们通过将以下函数添加到我们的 Question 模型来定义这种关系。

...
...
public function answers()
{
    return $this->hasMany('\Models\Answer');
}
...
...
Copy after login

之后,在 eloquent/app/controllers/Questions.php 控制器文件中,添加以下函数来获取带有答案的问题。

...
...
public static function get_questions_with_answers()
{
    $questions = Question::with('answers')->get()->toArray();
    return $questions;
}
...
...
Copy after login

它检索问题及其相应的答案。

让我们使用 index.php 文件对其进行测试,如以下代码片段所示。

<?php
require 'bootstrap.php';
use Controllers\Questions; 
 
$all = Questions::get_questions_with_answers();
?>
Copy after login

您可以使用 var_dumpprint_r 函数打印 $all 变量以查看结果。

任务 6:获取所有问题以及提出问题的用户

这将是一对一的关系,因为一个问题有一个用户,所以让我们将以下方法添加到 Question 模型中。

...
...
public function user()
{
    return $this->belongsTo('\Models\User');
}
...
...
Copy after login

之后,在 eloquent/app/controllers/Questions.php 控制器文件中,添加以下函数。

...
...
public static function get_questions_with_users()
{ 
    $questions = Question::with('user')->get()->toArray();
    return $questions; 
}
...
...
Copy after login

让我们使用 index.php 文件对其进行测试,如以下代码片段所示。

<?php
require 'bootstrap.php';
use Controllers\Questions; 
 
$all_with_users = Questions::get_questions_with_users();
?>
Copy after login

任务 7:获得一个问题并附上答案和点赞

首先,我们定义答案和点赞之间的关系。一个答案有很多赞成票,因此关系是一对多。

让我们将以下函数添加到我们的 Answer 模型中:

...
...
public function upvotes()
{
    return $this->hasMany('\Models\Upvote');
}
...
...
Copy after login

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;
}
...
...
Copy after login

让我们使用 index.php 文件对其进行测试,如以下代码片段所示。

<?php
require 'bootstrap.php';

use Controllers\Questions; 

$one_question = Questions::get_question_answers_upvotes(1);
?>
Copy after login

我们可以打印 $one_question 变量来查看结果。

任务 8:统计特定用户的所有问题

首先,我们在 eloquent/app/controllers/Users.php 控制器中导入 Question 模型:

use Models\Question;
Copy after login

导入后,我们在同一个文件中添加以下函数。

...
...
public static function question_count($user_id)
{
    $count = Question::where('user_id', $user_id)->count();
    return $count;
}
...
...
Copy after login

最后,让我们使用 index.php 文件对其进行测试,如以下代码片段所示。

<?php
require 'bootstrap.php';
use Controllers\Users; 
 
$user_question_count = Users::question_count(1);
?>
Copy after login

它返回 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;
}
...
...
Copy after login

最后,让我们使用 index.php 文件对其进行测试,如以下代码片段所示。

<?php
require 'bootstrap.php';
use Controllers\Answers; 
 
$update_answer = Answers::update_answer(1, "This is an updated answer");
?>
Copy after login

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

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

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

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

use Illuminate\Database\Eloquent\SoftDeletes;
Copy after login

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

use SoftDeletes;
Copy after login

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

protected $dates = ['deleted_at'];
Copy after login

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

<?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');
    }
}
?>
Copy after login

接下来,继续在 eloquent/app/controllers/Questions.php 控制器中创建 delete_question 方法。

...
...
public static function delete_question($question_id)
{
    $question = Question::find($question_id);
    $deleted = $question->delete();
    return $deleted; 
}
...
...
Copy after login

最后,让我们使用 index.php 文件对其进行测试,如以下代码片段所示。

<?php
require 'bootstrap.php';
use Controllers\Questions; 
 
$delete = Questions::delete_question(1);
?>
Copy after login

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

结论

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

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

You can find more information about Eloquent on the official Eloquent documentation page.

references

  • Illuminate database on GitHub
  • Eloquent ORM Documentation

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template