Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von Illuminate Database und Eloquent in einer PHP-Anwendung ohne Laravel

Verwendung von Illuminate Database und Eloquent in einer PHP-Anwendung ohne Laravel

王林
王林Original
2023-09-03 18:57:091099Durchsuche

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

Verwendung von Illuminate Database und Eloquent in einer PHP-Anwendung ohne Laravel

安装 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。您应该考虑在您的应用中同时使用这两者,以利用它们附带的有用功能。

Weitere Informationen zu Eloquent finden Sie auf der offiziellen Eloquent-Dokumentationsseite.

Referenzen

  • Illuminate-Datenbank auf GitHub
  • Eloquente ORM-Dokumentation

Dieser Artikel wurde mit einem Beitrag von Sajal Soni aktualisiert. Sajal kommt aus Indien und verbringt seine Zeit gerne damit, Websites auf Basis von Open-Source-Frameworks zu erstellen.

Das obige ist der detaillierte Inhalt vonVerwendung von Illuminate Database und Eloquent in einer PHP-Anwendung ohne Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn