Menggunakan Pangkalan Data Illuminate dan Eloquent dalam aplikasi PHP tanpa Laravel

王林
Lepaskan: 2023-09-03 18:58:02
asal
1109 orang telah melayarinya

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

Menggunakan Pangkalan Data Illuminate dan Eloquent dalam aplikasi PHP tanpa Laravel

安装 Eloquent 库

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

{
 "name": "illuminate-example/eloquent",
 "description": "Implementation of Database Queries with illuminate and Eloquent",
 "type": "project",
 "require": {}
}
Salin selepas log masuk

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

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

"autoload": {
    "psr-4": {
        "Controllers\\": "app/controllers/",
        "Models\\": "app/models/" 
    }
}
Salin selepas log masuk

现在,我们的 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/"
        }
    }
}
Salin selepas log masuk

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

$composer install
$composer dump-autoload -o
Salin selepas log masuk

设置数据库表和配置文件

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

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

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

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

答案

让我们使用以下 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;
Salin selepas log masuk

投票

让我们使用以下 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;
Salin selepas log masuk

用户

让我们使用以下 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;
Salin selepas log masuk

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

设置 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();
    }
}
Salin selepas log masuk

在上面的文件中,我们初始化了 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'];
}
?>
Salin selepas log masuk

问题模型

让我们创建包含以下内容的 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'];
}
?>
Salin selepas log masuk

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'];
}
?>
Salin selepas log masuk

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'];
      
}
?>
Salin selepas log masuk

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

创建前端控制器文件

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

bootstrap.php 文件

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

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

use Models\Database;

// initialize Illuminate database connection
new Database();
?>
Salin selepas log masuk

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

index.php 文件

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

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

<?php
require 'bootstrap.php';

// our example code goes here...
?>
Salin selepas log masuk

事实上,我们将使用 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;
    }
}
?>
Salin selepas log masuk

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

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

<?php
require 'bootstrap.php';

use Controllers\Users; 
 
$user = Users::create_user("user1", "user1@example.com", "user1_pass");
?>
Salin selepas log masuk

运行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;
    }
}
?>
Salin selepas log masuk

在我们的 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);
?>
Salin selepas log masuk

运行 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;
    }
}
?>
Salin selepas log masuk

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

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

<?php
require 'bootstrap.php';

use Controllers\Answers; 
 
$answers = Answers::add_answer("This is an answer", 1, 2);
?>
Salin selepas log masuk

运行 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;
}
...
...
Salin selepas log masuk

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

use Models\Upvote;
Salin selepas log masuk

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

<?php
require 'bootstrap.php';

use Controllers\Answers; 
 
$upvote = Answers::upvote_answer(1, 14);
?>
Salin selepas log masuk

任务 5:获取问题及答案

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

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

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

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

...
...
public function answers()
{
    return $this->hasMany('\Models\Answer');
}
...
...
Salin selepas log masuk

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

...
...
public static function get_questions_with_answers()
{
    $questions = Question::with('answers')->get()->toArray();
    return $questions;
}
...
...
Salin selepas log masuk

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

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

<?php
require 'bootstrap.php';
use Controllers\Questions; 
 
$all = Questions::get_questions_with_answers();
?>
Salin selepas log masuk

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

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

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

...
...
public function user()
{
    return $this->belongsTo('\Models\User');
}
...
...
Salin selepas log masuk

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

...
...
public static function get_questions_with_users()
{ 
    $questions = Question::with('user')->get()->toArray();
    return $questions; 
}
...
...
Salin selepas log masuk

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

<?php
require 'bootstrap.php';
use Controllers\Questions; 
 
$all_with_users = Questions::get_questions_with_users();
?>
Salin selepas log masuk

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

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

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

...
...
public function upvotes()
{
    return $this->hasMany('\Models\Upvote');
}
...
...
Salin selepas log masuk

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;
}
...
...
Salin selepas log masuk

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

<?php
require 'bootstrap.php';

use Controllers\Questions; 

$one_question = Questions::get_question_answers_upvotes(1);
?>
Salin selepas log masuk

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

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

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

use Models\Question;
Salin selepas log masuk

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

...
...
public static function question_count($user_id)
{
    $count = Question::where('user_id', $user_id)->count();
    return $count;
}
...
...
Salin selepas log masuk

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

<?php
require 'bootstrap.php';
use Controllers\Users; 
 
$user_question_count = Users::question_count(1);
?>
Salin selepas log masuk

它返回 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;
}
...
...
Salin selepas log masuk

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

<?php
require 'bootstrap.php';
use Controllers\Answers; 
 
$update_answer = Answers::update_answer(1, "This is an updated answer");
?>
Salin selepas log masuk

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

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

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

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

use Illuminate\Database\Eloquent\SoftDeletes;
Salin selepas log masuk

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

use SoftDeletes;
Salin selepas log masuk

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

protected $dates = ['deleted_at'];
Salin selepas log masuk

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

<?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');
    }
}
?>
Salin selepas log masuk

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

...
...
public static function delete_question($question_id)
{
    $question = Question::find($question_id);
    $deleted = $question->delete();
    return $deleted; 
}
...
...
Salin selepas log masuk

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

<?php
require 'bootstrap.php';
use Controllers\Questions; 
 
$delete = Questions::delete_question(1);
?>
Salin selepas log masuk

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

结论

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

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

Anda boleh mendapatkan maklumat lanjut tentang Eloquent pada halaman dokumentasi rasmi Eloquent.

Rujukan

  • Terangkan pangkalan data pada GitHub
  • Dokumentasi ORM yang fasih

Artikel ini telah dikemas kini dengan sumbangan daripada Sajal Soni. Sajal berasal dari India dan suka menghabiskan masanya mencipta laman web berdasarkan rangka kerja sumber terbuka.

Atas ialah kandungan terperinci Menggunakan Pangkalan Data Illuminate dan Eloquent dalam aplikasi PHP tanpa Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan