• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

在没有 Laravel 的 PHP 应用程序中使用 Eloquent 的 Illuminate 数据库

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

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

项目依赖 

应用功能

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

  • 添加用户

  • 添加问题

  • 添加问题的答案

  • 赞成一个答案

  • 得到有答案的问题

  • 获取所有问题和提出问题的用户

  • 获得特定的问题、答案和赞成票

  • 计算特定用户的问题

  • 更新用户的答案

  • 删除问题

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

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

在没有 Laravel 的 PHP 应用程序中使用 Eloquent Illuminate 数据库  第1张

安装 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文件中定义 DB 详细信息,如以下代码片段所示。请注意,这些值应替换为您自己的连接详细信息。

<?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_at和updated_at列。如果我们为模型启用时间戳,Eloquent 会在我们创建或更新记录时自动更新这些字段。

还有第三列称为 deleted_at。不过,deleted_at时间戳的工作方式不同。Eloquent 有一个软删除功能,它使用该deleted_at列来确定一条记录是否已被删除。如果使用 eloquentdelete函数删除记录并启用软删除,则该列将更新为删除时间。然后可以随时检索这些已删除的项目。

在此应用程序中,我们将利用时间戳,因此我们将在我们的模式创建中使用所有三个时间戳。

让我们在 MySQL 中使用以下命令创建表。

问题

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 语句questions在我们的数据库中创建表。


答案

让我们使用以下 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类来设置数据库连接。

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

Question模型_

让我们创建具有以下内容的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用于创建新用户的方法。我们已经使用模型的create方法Eloquent创建了一个新用户。

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

<?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用于创建新问题的方法。我们已经使用模型的create方法Eloquent创建了一个新问题。

让我们从我们的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.phpanswers文件后,它应该会在表中创建一个新答案。

任务 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.phpUpvote控制器文件中导入模型。

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_dump或print_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.phpQuestion控制器中导入模型:

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");
?>

如果更新成功,这将返回一个布尔值——真。

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

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

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

use Illuminate\Database\Eloquent\SoftDeletes;

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

use SoftDeletes;

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

protected $dates = ['deleted_at'];

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

<?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.phpdelete_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 还附带了 Query Builder,您可以将其用于更复杂的数据库查询,这绝对是您想要在您的应用程序中试验和使用的东西。

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


文章目录
    • 项目依赖
  • 应用功能
  • 安装 Eloquent 库
  • 设置数据库表和配置文件
    • 问题
    • 答案
    • 赞成票
    • 用户
  • 设置 Eloquent 模型
    • Database类_
    • User模型_
    • Question模型_
    • Answer模型_
    • Upvote模型_
  • 创建前端控制器文件
    • bootstrap.php文件_
    • index.php文件_
  • 任务 1:添加用户
  • 任务 2:添加问题
  • 任务 3:添加问题的答案
  • 任务 4:赞成一个答案
  • 任务 5:获得有答案的问题
  • 任务 6:获取所有问题和提出问题的用户
  • 任务 7:获得一个带有答案和赞成票的问题
  • 任务 8:计算特定用户的所有问题
  • 任务 9:更新用户的回答
  • 任务 10:删除问题(软删除)
  • 结论
  • 发表评论