在没有Laravel的PHP应用程序中以雄辩的方式使用Illuminate数据库

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

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

项目依赖
  1. PHP:5.5以上
  2. MySQL数据库
  3. 作曲家

应用功能

我们的应用程序将执行十项任务:

  • 添加用户。
  • 添加一个问题。
  • 添加问题的答案。
  • 支持答案。
  • 提出有问题的答案。
  • 获取所有问题和询问他们的用户。
  • 获得特定的问题,答案和支持。
  • 计算特定用户的问题。
  • 按用户更新答案。
  • 删除问题。

首先,我们创建项目目录和结构。

在主项目目录中,我们将创建一个应用程序文件夹,然后在此应用程序文件夹中,将创建两个文件夹: 型号控制器。 在这张照片中,我们的主项目文件夹被命名为雄辩。 您应该将其替换为您喜欢的任何名称。

我们的项目组织

接下来,我们在主项目文件夹中创建与app文件夹相同级别的index.php文件。

我们将使用git,因此我们将创建一个.gitignore文件。 请注意,此步骤是可选的。

接下来,我们安装该项目正常运行所需的依赖项。 在主项目文件夹中,我们将创建一个composer.json文件。 然后将其粘贴到我们的composer.json文件中。

{
 “name”: “illuminate-example/eloquent”,
 “description”: “Implementation of Database Queries with illuminate and Eloquent”,
 “type”: “project”,
 “require”: {}
}

要安装Illuminate数据库,我们将其添加到composer.json中:
“illuminate/database”: “5.1.8”,

接下来,我们为模型和控制器添加psr-4自动加载功能:

“autoload”: {
 “psr-4”: {
 “Controllers\\”: “app/controllers/”,
 “Models\\”: “app/models/” }
 }

现在,我们的composer.json文件应如下所示:

{
 “name”: “illuminate-example/eloquent”,
 “description”: “Implementation of Database Queries with illuminate and Eloquent”,
 “type”: “project”,
 “require”: {
 “illuminate/database”: “5.1.8”},
 “autoload”: 
    {“psr-4”: 
        { “Controllers\\”: “app/controllers/”,
            “Models\\”: “app/models/"
            
                 }
    }
}

现在,我们将在与composer.json文件相同的位置运行这两个composer命令:

composer install
composer dump-autoload -o

这将生成一个供应商文件夹,我们可以将其添加到gitignore(这也是可选步骤)。

让我们为数据库凭据添加一个配置文件。

在主项目目录中,我们创建一个名为config.php的文件,并在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’);

接下来,我们为我们的应用程序创建架构。

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

如果我们想在特定的表/模型上启用时间戳操作,则雄辩的ORM希望有两个时间戳列。 它们是created_atupdated_at列。 如果我们为模型启用了时间戳记,则Eloquent会使用创建或更新记录的时间自动更新这些字段。

第三列称为deleted_at 。 不过, deleted_at时间戳的工作方式有所不同。 Eloquent具有软删除功能,该功能使用deleted_at列确定记录是否已删除。 如果您使用雄辩的“删除”功能删除记录并启用“软删除”,则该列会随着删除时间进行更新。 然后可以随时检索这些删除的项目。

在此应用程序中,我们将利用时间戳记,因此将在架构创建中使用这三个时间戳。

在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;

答案

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;

投票

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;

用户数

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;

我们将在以下位置为表创建模型和控制器文件:

  • project_folder / app / models / question.php
  • project_folder / app / models / answer.php
  • project_folder / app / models / upvote.php
  • project_folder / app / models / user.php
  • project_folder / app / models / database.php
  • project_folder / app / controllers / questions.php
  • project_folder / app / controllers / answers.php
  • project_folder / app / controllers / upvotes.php
  • project_folder / app / controllers / users.php

使用编辑器打开models / database.php

首先,我们创建胶囊:

<?php

namespace Models; 
use Illuminate\Database\Capsule\Manager as Capsule;

class Database {

    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();
}

}

在上面的文件中,我们使用config.php中定义的常量初始化并设置了胶囊,然后雄辩地启动了。

下一步是创建启动脚本。 这将是运行我们的应用程序之前必须运行的所有文件的文件。

我们在位置project_folder / start.php中创建一个开始文件然后在该文件中要求Composer自动加载文件:

require 'vendor/autoload.php';

之后,我们需要config.php来获取定义的凭证: require 'config.php';

然后我们初始化数据库类。

<?php

use Models\Database;

//Boot Database Connection
new Database();

您的start.php应该如下所示:

<?php
require ‘config.php’;
require ‘vendor/autoload.php’;
use Models\Database;
//Initialize Illuminate Database Connection
new Database();
?>

在您的index.php中包含start.php,因为这将是我们的主文件。

现在,我们的index.php文件如下所示:

<?php
require ‘start.php’;
?>

接下来,我们可以开始研究控制器和模型。 在project_folder / app / models / question.php中,我们添加以下内容:

<?php

namespace Models;

use \Illuminate\Database\Eloquent\Model;

class Question extends Model {
    
    protected $table = ‘questions’;
    
}

?>

然后在project_folder /app/controllers/questions.php中

<?php
namespace Controllers;

class Questions{
    
}

?>

project_folder /app/controllers/answers.php中 ,我们执行以下操作:

<?php
namespace Controllers;

class Answers{
    
}
?>

任务1:添加用户

在用户模型( project_folder /app/models/user.php)中,我们添加以下代码来定义我们的名称空间,扩展Eloquent模型并定义表名( protected $table )以及protected $table哪些字段可以填充通过大量创建( protected $fillable )。

<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;

class User extends Model {
    protected $table = ‘users’;
    protected $fillable = [‘username’,’email’,’pass’];
}
?>

在用户控制器( project_folder /app/controllers/user.php )中,我们照常定义名称空间和类:

<?php
namespace Controllers;

class Users{
    
}
?>

然后要创建一个用户,在用户控制器中,我们导入用户Model命名空间, use Models\User; ,然后添加一个函数来创建用户。

<?php

    public static function create_user($username, $email, $password){
        $user = User::create(['username'=>$username,'email'=>$email,'password'=>$password]);
        return $user;
    }

我们的用户控制器现在看起来像这样。

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

然后在index.php中,添加以下行并运行应用程序以创建新用户。

<?php

use Controllers\Users; 

// Import user controller
$user = Users::create_user(“user1”,”user1@example.com”,”user1_pass”);

任务2:添加问题

要添加问题,我们将问题模型名称空间导入问题控制器,并编写一个create_question函数:

use Models\Question;

然后:

<?php

public static function create_question($question,$user_id){

    $question = Question::create(['question'=>$question,'user_id'=>$user_id]);
    return $question;
}

我们已经使用Eloquent大量创建模型来插入此记录,但是在它起作用之前,我们需要允许这些字段可填充,因为Eloquent模型默认情况下会阻止大量创建。

因此,我们进入question模型并将protected $fillable属性添加到类中。

protected $fillable = ['question','user_id'];

要运行此命令,请将问题控制器导入index.php并静态调用create_question函数:

use Controllers\Question;

然后使用问题和用户ID作为参数创建一个问题:

$question = Questions::create_question("Have you ever met your doppelganger?",1);

如果成功,则返回模型对象。

现在,我们将使用不同的条目运行index.php脚本,以向数据库中添加更多问题。

任务3:为问题添加答案

在答案模型中,我们通过添加以下代码来重复针对问题和用户模型采取的步骤:

<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;

class Answer extends Model {
    
    protected $table = ‘answers’;
    protected $fillable = [‘answer’,’user_id’,’question_id’];
    
}
?>

然后在答案控制器中,我们编写以下行:

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

?>

然后,在index.php中,我们可以为前面添加的ID 1(用户ID为2)创建问题的答案。不要忘记首先将答案控制器导入index.php。

<?php

use Controllers\Answers;

    $answers = Answers::add_answer(“This is an answer”,1,2);

为防止出现多个条目,请在运行一个新的注释之前在index.php中注释所有其他调用。

任务4:批准答案

这几乎与我们惯用的步骤相同。

因此,我们将其复制到位于project_folder / app / models / upvote.php的Upvote模型中。

<?php 
namespace Models;

use \Illuminate\Database\Eloquent\Model;


class Upvote extends Model {

    protected $table = 'upvotes';
    protected $fillable = ['answer_id','user_id'];
     
}
 ?>

然后在答案控制器中,导入Upvote Model命名空间。

use Models\Upvote;

然后,我们创建一个upvote_answer函数。

<?php

    public static function upvote_answer($answer_id,$user_id){
        $upvote = Upvote::create(['answer_id'=>$answer_id,'user_id'=>$user_id]);
        return $upvote;
    }

在index.php中,我们可以使用虚拟用户ID调用该函数以对ID为1的答案进行投票。

$upvote = Answers::upvote_answer(1,14);

任务5:回答问题

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

关系的类型包括一对一,一对多,多对多等。

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

首先,我们通过将此函数添加到问题模型中来定义这种关系。

<?php

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

然后在问题控制器中,我们编写一个函数以获取具有答案的问题。

<?php

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

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

在index.php中,我们注释所有其他调用并运行:

$all = Questions::get_questions_with_answers();

我们可以在var_dumpprint_r $all变量中查看结果。

任务6:获取所有问题和询问他们的用户

这是一对一的关系,因为一个问题有一个用户,因此我们将其添加到问题模型中。

<?php

public function user()
{
    return $this->belongsTo(‘\Models\User’);
}

然后,我们在问题控制器中创建一个函数,并在问题模型上使用with函数。

<?php

public static function get_questions_with_users(){

    $questions = Question::with('user')->get()->toArray();
    return $questions; 
}

在index.php中,注释所有其他内容并运行:

$all_with_users = Questions::get_questions_with_users();

任务7:通过答案和投票获得一个问题

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

因此,我们将以下函数添加到我们的答案模型中:

<?php

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

然后在问题控制器中,我们创建函数来获取此信息:

<?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 = Questions::get_question_answers_upvotes(1);

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

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

首先,我们将问题模型导入用户控制器中:

use Models\Question;

然后我们编写此函数:

<?php

public static function question_count($user_id){

    $count = Question::where('user_id',$user_id)->count();
    return $count;
}

在index.php中,我们注释其他调用并添加以下行:

$user_question_count = Users::question_count(1);

这将返回一个整数,该整数是ID为1的用户添加的问题数。

我们可以打印$user_question_count变量并运行index.php以查看结果。

任务9:按用户更新答案

用Eloquent ORM进行更新的概念非常简单。 首先我们找到一条记录,然后我们进行变异并保存。

现在,在答案控制器中,我们添加以下功能:

<?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中,我们可以注释所有其他呼叫,并更新ID为1的答案,如下所示:

$update_answer = Answers::update_answer(1,”This is an updated answer”);

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

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

在这最后的任务中,我们将实现Eloquent SoftDelete。

首先,通过导入SoftDeletes命名空间,然后在我们的类中使用SoftDeletes特性,告诉问题模型使用SoftDeletes

use Illuminate\Database\Eloquent\SoftDeletes;

然后在类声明行之后,添加以下行:

use SoftDeletes;

然后,将deleted_at添加到该模型的protected $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');
    }

 }

 ?>

然后,我们在问题控制器中创建delete_question函数。

<?php

public static function delete_question($question_id){

    $question = Question::find($question_id);
    $deleted = $question->delete();
    return $deleted; 

}

在index.php中运行:

$delete = Questions::delete_question(1);

恭喜你! 您刚刚使用Illuminate和Eloquent构建了功能齐全的后端。 而且,我们无需编写太多代码即可实现所有这些目标。

本教程的代码可以在GitHub找到

结论

Illuminate还附带了查询生成器,您可以将其用于更复杂的数据库查询,并且绝对是您要尝试并在您的应用程序中使用的东西。

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

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

翻译自: https://code.tutsplus.com/tutorials/using-illuminate-database-with-eloquent-in-your-php-app-without-laravel--cms-27247

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值